as released 2003-02-06
74
docs/Coordinate_system_documentation.html
Normal file
|
@ -0,0 +1,74 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>MOHAA - SDK</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<b><u><font size=+2>Coordinate System Documentation</font></u></b>
|
||||
<br>
|
||||
<p>
|
||||
Last Updated: December 11, 2002
|
||||
</p>
|
||||
|
||||
<b>Translation</b>
|
||||
<br>
|
||||
<p>
|
||||
World coordinates in Medal of Honor: Allied Assault is arranged such that the plane formed by the X & Y axis is horizontal, with the Z axis pointing up from there. In the editor, this is represented with positive Y being up, and positive X to the right.
|
||||
</p>
|
||||
|
||||
<b>Example 1:</b>
|
||||
<p>
|
||||
World coordinate axis
|
||||
<br>
|
||||
<img src="Coordinate_system_documentation/1-1.jpg">
|
||||
</p>
|
||||
|
||||
<b>Rotation</b>
|
||||
<br>
|
||||
<p>
|
||||
Rotation in Medal of Honor: Allied Assault uses a separate set of axis than the map coordinates use. Rotational vectors stored (X, Y, Z) represent (Pitch, Yaw, Roll).<br>
|
||||
<br>
|
||||
You can think of the matrices returned by the game functions as returning 3 vectors: Forward, Left, and Up. Positive X rotation results in Forward to pitch downwards. Positive Y rotation results in Forward and Left to rotate counter-clockwise around Up. Positive Z rotation results in Left and Up to roll to the right around Forward. An angle of (0, 0, 0) looks positively along the X-axis, with the Y-axis going positively to the left, and the Z-axis going positively up.<br>
|
||||
<br>
|
||||
Game functions that change angles to a matrix or axis (AnglesToMat, AnglesToAxis) return a left-handed coordinate system. In world coordinates, (0,0,0) would produce:<br>
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
X | 1 0 0 |
|
||||
Y | 0 -1 0 |
|
||||
Z | 0 0 1 |
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
Game functions that change angles to vectors (AngleVectors, Vector::AngleVectors) return a left-handed coordinate system, but as 3 directional vectors. This is convenient for dealing with relative motion to an object. (0, 0, 0) would produce:
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
forward [ 1 0 0 ]
|
||||
right [ 0 1 0 ]
|
||||
up [ 0 0 1 ]
|
||||
</pre>
|
||||
|
||||
<b>Example 2:</b>
|
||||
<p>
|
||||
Object rotation axis
|
||||
<br>
|
||||
<img src="Coordinate_system_documentation/1-2.jpg">
|
||||
</p>
|
||||
|
||||
|
||||
</body>
|
||||
|
||||
|
||||
<p>
|
||||
|
||||
</p>
|
||||
|
||||
|
||||
|
||||
<pre>
|
||||
<i><font color=blue>
|
||||
|
||||
</font>
|
||||
</i>
|
||||
</pre>
|
BIN
docs/Coordinate_system_documentation/1-1.jpg
Normal file
After Width: | Height: | Size: 5.3 KiB |
BIN
docs/Coordinate_system_documentation/1-2.jpg
Normal file
After Width: | Height: | Size: 5.2 KiB |
49
docs/Getting_Started_Tutorial_files/CVS/Entries
Normal file
|
@ -0,0 +1,49 @@
|
|||
/filelist.xml/1.1/Mon Feb 11 23:15:46 2002//
|
||||
/image001.png/1.1/Mon Feb 11 23:16:02 2002/-kb/
|
||||
/image002.jpg/1.1/Mon Feb 11 23:16:02 2002/-kb/
|
||||
/image003.png/1.1/Mon Feb 11 23:16:02 2002/-kb/
|
||||
/image004.jpg/1.1/Mon Feb 11 23:16:02 2002/-kb/
|
||||
/image005.png/1.1/Mon Feb 11 23:16:02 2002/-kb/
|
||||
/image006.jpg/1.1/Mon Feb 11 23:16:02 2002/-kb/
|
||||
/image007.png/1.1/Mon Feb 11 23:16:02 2002/-kb/
|
||||
/image008.jpg/1.1/Mon Feb 11 23:16:02 2002/-kb/
|
||||
/image009.png/1.1/Mon Feb 11 23:16:02 2002/-kb/
|
||||
/image010.jpg/1.1/Mon Feb 11 23:16:02 2002/-kb/
|
||||
/image011.png/1.1/Mon Feb 11 23:16:02 2002/-kb/
|
||||
/image012.jpg/1.1/Mon Feb 11 23:16:02 2002/-kb/
|
||||
/image013.png/1.1/Mon Feb 11 23:16:02 2002/-kb/
|
||||
/image014.jpg/1.1/Mon Feb 11 23:16:02 2002/-kb/
|
||||
/image015.png/1.1/Mon Feb 11 23:16:02 2002/-kb/
|
||||
/image016.jpg/1.1/Mon Feb 11 23:16:02 2002/-kb/
|
||||
/image017.png/1.1/Mon Feb 11 23:16:02 2002/-kb/
|
||||
/image018.jpg/1.1/Mon Feb 11 23:16:02 2002/-kb/
|
||||
/image019.png/1.1/Mon Feb 11 23:16:02 2002/-kb/
|
||||
/image020.jpg/1.1/Mon Feb 11 23:16:02 2002/-kb/
|
||||
/image021.png/1.1/Mon Feb 11 23:16:02 2002/-kb/
|
||||
/image022.jpg/1.1/Mon Feb 11 23:16:02 2002/-kb/
|
||||
/image023.png/1.1/Mon Feb 11 23:16:02 2002/-kb/
|
||||
/image024.jpg/1.1/Mon Feb 11 23:16:02 2002/-kb/
|
||||
/image025.png/1.1/Mon Feb 11 23:16:02 2002/-kb/
|
||||
/image026.jpg/1.1/Mon Feb 11 23:16:02 2002/-kb/
|
||||
/image027.png/1.1/Mon Feb 11 23:16:02 2002/-kb/
|
||||
/image028.jpg/1.1/Mon Feb 11 23:16:02 2002/-kb/
|
||||
/image029.png/1.1/Mon Feb 11 23:16:02 2002/-kb/
|
||||
/image030.jpg/1.1/Mon Feb 11 23:16:02 2002/-kb/
|
||||
/image031.png/1.1/Mon Feb 11 23:16:02 2002/-kb/
|
||||
/image032.jpg/1.1/Mon Feb 11 23:16:02 2002/-kb/
|
||||
/image033.png/1.1/Mon Feb 11 23:16:02 2002/-kb/
|
||||
/image034.jpg/1.1/Mon Feb 11 23:16:02 2002/-kb/
|
||||
/image035.png/1.1/Mon Feb 11 23:16:02 2002/-kb/
|
||||
/image036.jpg/1.1/Mon Feb 11 23:16:02 2002/-kb/
|
||||
/image037.png/1.1/Mon Feb 11 23:16:02 2002/-kb/
|
||||
/image038.jpg/1.1/Mon Feb 11 23:16:02 2002/-kb/
|
||||
/image039.png/1.1/Mon Feb 11 23:16:02 2002/-kb/
|
||||
/image040.jpg/1.1/Mon Feb 11 23:16:02 2002/-kb/
|
||||
/image041.png/1.1/Mon Feb 11 23:16:02 2002/-kb/
|
||||
/image042.jpg/1.1/Mon Feb 11 23:16:02 2002/-kb/
|
||||
/image043.png/1.1/Mon Feb 11 23:16:02 2002/-kb/
|
||||
/image044.jpg/1.1/Mon Feb 11 23:16:02 2002/-kb/
|
||||
/image045.png/1.1/Mon Feb 11 23:16:02 2002/-kb/
|
||||
/image046.jpg/1.1/Mon Feb 11 23:16:02 2002/-kb/
|
||||
/oledata.mso/1.1/Mon Feb 11 23:16:02 2002/-kb/
|
||||
D
|
1
docs/Getting_Started_Tutorial_files/CVS/Repository
Normal file
|
@ -0,0 +1 @@
|
|||
mohta/docs/LD_docs/Getting Started Tutorial_files
|
1
docs/Getting_Started_Tutorial_files/CVS/Root
Normal file
|
@ -0,0 +1 @@
|
|||
:pserver:jason@qix:/repository
|
51
docs/Getting_Started_Tutorial_files/filelist.xml
Normal file
|
@ -0,0 +1,51 @@
|
|||
<xml xmlns:o="urn:schemas-microsoft-com:office:office">
|
||||
<o:MainFile HRef="../Getting%20Started%20Tutorial.htm"/>
|
||||
<o:File HRef="image001.png"/>
|
||||
<o:File HRef="image002.jpg"/>
|
||||
<o:File HRef="oledata.mso"/>
|
||||
<o:File HRef="image003.png"/>
|
||||
<o:File HRef="image004.jpg"/>
|
||||
<o:File HRef="image005.png"/>
|
||||
<o:File HRef="image006.jpg"/>
|
||||
<o:File HRef="image007.png"/>
|
||||
<o:File HRef="image008.jpg"/>
|
||||
<o:File HRef="image009.png"/>
|
||||
<o:File HRef="image010.jpg"/>
|
||||
<o:File HRef="image011.png"/>
|
||||
<o:File HRef="image012.jpg"/>
|
||||
<o:File HRef="image013.png"/>
|
||||
<o:File HRef="image014.jpg"/>
|
||||
<o:File HRef="image015.png"/>
|
||||
<o:File HRef="image016.jpg"/>
|
||||
<o:File HRef="image017.png"/>
|
||||
<o:File HRef="image018.jpg"/>
|
||||
<o:File HRef="image019.png"/>
|
||||
<o:File HRef="image020.jpg"/>
|
||||
<o:File HRef="image021.png"/>
|
||||
<o:File HRef="image022.jpg"/>
|
||||
<o:File HRef="image023.png"/>
|
||||
<o:File HRef="image024.jpg"/>
|
||||
<o:File HRef="image025.png"/>
|
||||
<o:File HRef="image026.jpg"/>
|
||||
<o:File HRef="image027.png"/>
|
||||
<o:File HRef="image028.jpg"/>
|
||||
<o:File HRef="image029.png"/>
|
||||
<o:File HRef="image030.jpg"/>
|
||||
<o:File HRef="image031.png"/>
|
||||
<o:File HRef="image032.jpg"/>
|
||||
<o:File HRef="image033.png"/>
|
||||
<o:File HRef="image034.jpg"/>
|
||||
<o:File HRef="image035.png"/>
|
||||
<o:File HRef="image036.jpg"/>
|
||||
<o:File HRef="image037.png"/>
|
||||
<o:File HRef="image038.jpg"/>
|
||||
<o:File HRef="image039.png"/>
|
||||
<o:File HRef="image040.jpg"/>
|
||||
<o:File HRef="image041.png"/>
|
||||
<o:File HRef="image042.jpg"/>
|
||||
<o:File HRef="image043.png"/>
|
||||
<o:File HRef="image044.jpg"/>
|
||||
<o:File HRef="image045.png"/>
|
||||
<o:File HRef="image046.jpg"/>
|
||||
<o:File HRef="filelist.xml"/>
|
||||
</xml>
|
BIN
docs/Getting_Started_Tutorial_files/image001.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
docs/Getting_Started_Tutorial_files/image002.jpg
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
docs/Getting_Started_Tutorial_files/image003.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
docs/Getting_Started_Tutorial_files/image004.jpg
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
docs/Getting_Started_Tutorial_files/image005.png
Normal file
After Width: | Height: | Size: 8.6 KiB |
BIN
docs/Getting_Started_Tutorial_files/image006.jpg
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
docs/Getting_Started_Tutorial_files/image007.png
Normal file
After Width: | Height: | Size: 845 B |
BIN
docs/Getting_Started_Tutorial_files/image008.jpg
Normal file
After Width: | Height: | Size: 1.6 KiB |
BIN
docs/Getting_Started_Tutorial_files/image009.png
Normal file
After Width: | Height: | Size: 9.4 KiB |
BIN
docs/Getting_Started_Tutorial_files/image010.jpg
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
docs/Getting_Started_Tutorial_files/image011.png
Normal file
After Width: | Height: | Size: 6.3 KiB |
BIN
docs/Getting_Started_Tutorial_files/image012.jpg
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
docs/Getting_Started_Tutorial_files/image013.png
Normal file
After Width: | Height: | Size: 2 KiB |
BIN
docs/Getting_Started_Tutorial_files/image014.jpg
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
docs/Getting_Started_Tutorial_files/image015.png
Normal file
After Width: | Height: | Size: 4.2 KiB |
BIN
docs/Getting_Started_Tutorial_files/image016.jpg
Normal file
After Width: | Height: | Size: 5.7 KiB |
BIN
docs/Getting_Started_Tutorial_files/image017.png
Normal file
After Width: | Height: | Size: 277 B |
BIN
docs/Getting_Started_Tutorial_files/image018.jpg
Normal file
After Width: | Height: | Size: 631 B |
BIN
docs/Getting_Started_Tutorial_files/image019.png
Normal file
After Width: | Height: | Size: 309 B |
BIN
docs/Getting_Started_Tutorial_files/image020.jpg
Normal file
After Width: | Height: | Size: 681 B |
BIN
docs/Getting_Started_Tutorial_files/image021.png
Normal file
After Width: | Height: | Size: 373 B |
BIN
docs/Getting_Started_Tutorial_files/image022.jpg
Normal file
After Width: | Height: | Size: 672 B |
BIN
docs/Getting_Started_Tutorial_files/image023.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
docs/Getting_Started_Tutorial_files/image024.jpg
Normal file
After Width: | Height: | Size: 3.6 KiB |
BIN
docs/Getting_Started_Tutorial_files/image025.png
Normal file
After Width: | Height: | Size: 3.5 KiB |
BIN
docs/Getting_Started_Tutorial_files/image026.jpg
Normal file
After Width: | Height: | Size: 7.8 KiB |
BIN
docs/Getting_Started_Tutorial_files/image027.png
Normal file
After Width: | Height: | Size: 8 KiB |
BIN
docs/Getting_Started_Tutorial_files/image028.jpg
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
docs/Getting_Started_Tutorial_files/image029.png
Normal file
After Width: | Height: | Size: 9.5 KiB |
BIN
docs/Getting_Started_Tutorial_files/image030.jpg
Normal file
After Width: | Height: | Size: 20 KiB |
BIN
docs/Getting_Started_Tutorial_files/image031.png
Normal file
After Width: | Height: | Size: 245 B |
BIN
docs/Getting_Started_Tutorial_files/image032.jpg
Normal file
After Width: | Height: | Size: 660 B |
BIN
docs/Getting_Started_Tutorial_files/image033.png
Normal file
After Width: | Height: | Size: 9.1 KiB |
BIN
docs/Getting_Started_Tutorial_files/image034.jpg
Normal file
After Width: | Height: | Size: 21 KiB |
BIN
docs/Getting_Started_Tutorial_files/image035.png
Normal file
After Width: | Height: | Size: 3.9 KiB |
BIN
docs/Getting_Started_Tutorial_files/image036.jpg
Normal file
After Width: | Height: | Size: 9.5 KiB |
BIN
docs/Getting_Started_Tutorial_files/image037.png
Normal file
After Width: | Height: | Size: 19 KiB |
BIN
docs/Getting_Started_Tutorial_files/image038.jpg
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
docs/Getting_Started_Tutorial_files/image039.png
Normal file
After Width: | Height: | Size: 70 KiB |
BIN
docs/Getting_Started_Tutorial_files/image040.jpg
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
docs/Getting_Started_Tutorial_files/image041.png
Normal file
After Width: | Height: | Size: 109 KiB |
BIN
docs/Getting_Started_Tutorial_files/image042.jpg
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
docs/Getting_Started_Tutorial_files/image043.png
Normal file
After Width: | Height: | Size: 79 KiB |
BIN
docs/Getting_Started_Tutorial_files/image044.jpg
Normal file
After Width: | Height: | Size: 35 KiB |
BIN
docs/Getting_Started_Tutorial_files/image045.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
docs/Getting_Started_Tutorial_files/image046.jpg
Normal file
After Width: | Height: | Size: 2.6 KiB |
BIN
docs/Getting_Started_Tutorial_files/oledata.mso
Normal file
131
docs/MOH GUI Documentation.html
Normal file
|
@ -0,0 +1,131 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>MOHAA - SDK</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<b><u><font size=+2>GUI Documentation</font></u></b>
|
||||
<br>
|
||||
<br>
|
||||
|
||||
<p>
|
||||
DlgEdit – This is the editor that allows you to create GUIs for the game. Right click the on the window to bring up the Menu Properties dialog. Here’s a description of the fields:
|
||||
</p>
|
||||
|
||||
<ul>
|
||||
<li>Menu Name: The name of the menu that you will reference it by in the game.
|
||||
<li>Motion Direction: This is the direction that the menu will appear from when toggled in the game. Choices are NONE (Default), FROM_TOP, FROM_BOTTOM, FROM_LEFT, and FROM_RIGHT.
|
||||
<li>Time: This is the amount of time the menu takes to appear or disappear when toggled.
|
||||
<li>General Commands: You can add any of the appropriate layout commands mentioned below.
|
||||
|
||||
</ul>
|
||||
|
||||
<p><center>
|
||||
<img src="MOH GUI Documentation/1-1.jpg">
|
||||
</center></p>
|
||||
|
||||
<p>
|
||||
To create a widget, just click the LMB anywhere in the background and drag out a region. This will define the frame of the widget. Double click in the frame of that widget to bring up the Widget Properties Dialog. Here’s a description of the fields:
|
||||
</p>
|
||||
|
||||
<Table cellspacing="3" cellpadding="3" border=0 align=center width=100%>
|
||||
<tr>
|
||||
<td>
|
||||
<img src="MOH GUI Documentation/1-2.jpg">
|
||||
</td>
|
||||
<td>
|
||||
<ul>
|
||||
<li>Name - Internal name of the widget. This really isn’t used much in the game and was added (just in case we need it).
|
||||
<li>Class - Defines the class of the widget (Button, Label, List, etc…).
|
||||
<li>Title – Title to be displayed for labels, buttons, etc..
|
||||
<li>Cmd – Stuff command to be put into the command buffer when the widget is activated (i.e. button is pressed).
|
||||
<li>Cvar – Name of the cvar to link this widget with. If the value of the widget changes, then this cvar will be updated with the appropriate value.
|
||||
<li>Border – Style of the border of the widget.
|
||||
<li>BGColor – Background color of the widget.
|
||||
<li>BGAlpha – Background alpha of the widget.
|
||||
<li>FGColor – Foreground color of the widget.
|
||||
<li>FGAlpha – Foreground alpha of the widget.
|
||||
<li>Position – Position of the widget ( x,y,width,height).
|
||||
<li>Class specific attributes – Extra information that applies to the widget. See the list of layout commands below.
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<br>
|
||||
<br>
|
||||
<Table cellspacing="3" cellpadding="3" border=1>
|
||||
<tr>
|
||||
<td>align <left> <right> <top> <bottom>
|
||||
<td>Aligns the widget to the specified directions (resolution independent)
|
||||
</tr>
|
||||
<tr>
|
||||
<td>shader <shadername>
|
||||
<td>Sets the shader of the widget. This will be drawn stretched in the widget
|
||||
</tr>
|
||||
<tr>
|
||||
<td>tileshader <shadername>
|
||||
<td>Sets the shader of the widget. This will be drawn tiled in the widget
|
||||
</tr>
|
||||
<tr>
|
||||
<td>hovershader <shadername>
|
||||
<td>Sets the shader that will be drawn when the mouse is hovering over the widget
|
||||
</tr>
|
||||
<tr>
|
||||
<td>additem <item>
|
||||
<td>Adds the specified item to a list or listbox widget
|
||||
</tr>
|
||||
<tr>
|
||||
<td>setrange <min> <max>
|
||||
<td>Sets the range of the slider from min to max
|
||||
</tr>
|
||||
<tr>
|
||||
<td>direction <from_left | from_right | from_top | from_bottom>
|
||||
<td>Sets the direction of the shader when it appears on the screen. It will scroll in from that direction over time
|
||||
</tr>
|
||||
<tr>
|
||||
<td>slidertype <integer | float>
|
||||
<td>Sets the type of the slider to either integral or floating value
|
||||
</tr>
|
||||
<tr>
|
||||
<td>fadein <time>
|
||||
<td>Makes the widget fade in over the specified time
|
||||
</tr>
|
||||
<tr>
|
||||
<td>stopsound <soundname>
|
||||
<td>Plays the sound specified when the widget stops moving
|
||||
</tr>
|
||||
<tr>
|
||||
<td>clicksound <soundname>
|
||||
<td>Plays the sound specified when the widget is clicked
|
||||
</tr>
|
||||
<tr>
|
||||
<td>stretch < horizontal | vertical >
|
||||
<td>Stretch the widget horizontally or vertically across the whole screen (resolution independent )
|
||||
</tr>
|
||||
<tr>
|
||||
<td>initdata <data>
|
||||
<td>Initializes the widget to data (used for sliders)
|
||||
</tr>
|
||||
<tr>
|
||||
<td>sliderstep <stepsize>
|
||||
<td>Sets the stepsize for the slider
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
</body>
|
||||
|
||||
|
||||
|
||||
<p>
|
||||
|
||||
</p>
|
||||
|
||||
|
||||
|
||||
<pre>
|
||||
<i><font color=blue>
|
||||
|
||||
</font>
|
||||
</i>
|
||||
</pre>
|
784
docs/MOH Getting Started Tutorial.htm
Normal file
|
@ -0,0 +1,784 @@
|
|||
<html xmlns:v="urn:schemas-microsoft-com:vml"
|
||||
xmlns:o="urn:schemas-microsoft-com:office:office"
|
||||
xmlns:w="urn:schemas-microsoft-com:office:word"
|
||||
xmlns="http://www.w3.org/TR/REC-html40">
|
||||
|
||||
<head>
|
||||
<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
|
||||
<meta name=ProgId content=Word.Document>
|
||||
<meta name=Generator content="Microsoft Word 9">
|
||||
<meta name=Originator content="Microsoft Word 9">
|
||||
<link rel=File-List href="./Getting%20Started%20Tutorial_files/filelist.xml">
|
||||
<link rel=Edit-Time-Data
|
||||
href="./Getting%20Started%20Tutorial_files/editdata.mso">
|
||||
<link rel=OLE-Object-Data
|
||||
href="./Getting%20Started%20Tutorial_files/oledata.mso">
|
||||
<!--[if !mso]>
|
||||
<style>
|
||||
v\:* {behavior:url(#default#VML);}
|
||||
o\:* {behavior:url(#default#VML);}
|
||||
w\:* {behavior:url(#default#VML);}
|
||||
.shape {behavior:url(#default#VML);}
|
||||
</style>
|
||||
<![endif]-->
|
||||
<title>This tutorial assumes that you’ve successfully installed and set up
|
||||
MOHRadiant and have all the path information set correctly</title>
|
||||
<!--[if gte mso 9]><xml>
|
||||
<o:DocumentProperties>
|
||||
<o:Author>Nate</o:Author>
|
||||
<o:LastAuthor>EA</o:LastAuthor>
|
||||
<o:Revision>2</o:Revision>
|
||||
<o:TotalTime>11</o:TotalTime>
|
||||
<o:Created>2002-02-11T23:13:00Z</o:Created>
|
||||
<o:LastSaved>2002-02-11T23:13:00Z</o:LastSaved>
|
||||
<o:Pages>12</o:Pages>
|
||||
<o:Words>1383</o:Words>
|
||||
<o:Characters>7884</o:Characters>
|
||||
<o:Company>2015</o:Company>
|
||||
<o:Lines>65</o:Lines>
|
||||
<o:Paragraphs>15</o:Paragraphs>
|
||||
<o:CharactersWithSpaces>9682</o:CharactersWithSpaces>
|
||||
<o:Version>9.3821</o:Version>
|
||||
</o:DocumentProperties>
|
||||
</xml><![endif]-->
|
||||
<style>
|
||||
<!--
|
||||
/* Style Definitions */
|
||||
p.MsoNormal, li.MsoNormal, div.MsoNormal
|
||||
{mso-style-parent:"";
|
||||
margin:0in;
|
||||
margin-bottom:.0001pt;
|
||||
mso-pagination:widow-orphan;
|
||||
font-size:12.0pt;
|
||||
font-family:"Times New Roman";
|
||||
mso-fareast-font-family:"Times New Roman";}
|
||||
h1
|
||||
{mso-style-next:Normal;
|
||||
margin:0in;
|
||||
margin-bottom:.0001pt;
|
||||
mso-pagination:widow-orphan;
|
||||
page-break-after:avoid;
|
||||
mso-outline-level:1;
|
||||
font-size:12.0pt;
|
||||
font-family:"Times New Roman";
|
||||
mso-font-kerning:0pt;}
|
||||
p.MsoTitle, li.MsoTitle, div.MsoTitle
|
||||
{margin:0in;
|
||||
margin-bottom:.0001pt;
|
||||
text-align:center;
|
||||
mso-pagination:widow-orphan;
|
||||
font-size:12.0pt;
|
||||
font-family:"Times New Roman";
|
||||
mso-fareast-font-family:"Times New Roman";
|
||||
font-weight:bold;}
|
||||
@page Section1
|
||||
{size:8.5in 11.0in;
|
||||
margin:1.0in 1.25in 1.0in 1.25in;
|
||||
mso-header-margin:.5in;
|
||||
mso-footer-margin:.5in;
|
||||
mso-paper-source:0;}
|
||||
div.Section1
|
||||
{page:Section1;}
|
||||
-->
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body lang=EN-US style='tab-interval:.5in'>
|
||||
|
||||
<div class=Section1>
|
||||
|
||||
<p class=MsoTitle>Building a Room</p>
|
||||
|
||||
<p class=MsoNormal><b><![if !supportEmptyParas]> <![endif]><o:p></o:p></b></p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal>This tutorial assumes that you’ve successfully installed and
|
||||
set up MOHRadiant and have all the path information set correctly. This
|
||||
tutorial also assumes that you have no previous experience editing Quake Levels</p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal><b>Section 1</b>: Intro to brushes and the camera</p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal><span style='mso-tab-count:1'> </span>Brushes are
|
||||
the building block for worlds in Quake engine games such as MOH.<span
|
||||
style="mso-spacerun: yes"> </span>Brushes can only be convex shapes.<span
|
||||
style="mso-spacerun: yes"> </span>In order to build a concave object you will
|
||||
use multiple brushes.<span style="mso-spacerun: yes"> </span>This is for
|
||||
efficient collision detection in the game.</p>
|
||||
|
||||
<p class=MsoNormal><span style='mso-tab-count:1'> </span></p>
|
||||
|
||||
<p class=MsoNormal><span style='mso-tab-count:1'> </span>To create a
|
||||
new brush simply drag a box in the 2d view like this:</p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal><!--[if gte vml 1]><v:shapetype id="_x0000_t75" coordsize="21600,21600"
|
||||
o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f"
|
||||
stroked="f">
|
||||
<v:stroke joinstyle="miter"/>
|
||||
<v:formulas>
|
||||
<v:f eqn="if lineDrawn pixelLineWidth 0"/>
|
||||
<v:f eqn="sum @0 1 0"/>
|
||||
<v:f eqn="sum 0 0 @1"/>
|
||||
<v:f eqn="prod @2 1 2"/>
|
||||
<v:f eqn="prod @3 21600 pixelWidth"/>
|
||||
<v:f eqn="prod @3 21600 pixelHeight"/>
|
||||
<v:f eqn="sum @0 0 1"/>
|
||||
<v:f eqn="prod @6 1 2"/>
|
||||
<v:f eqn="prod @7 21600 pixelWidth"/>
|
||||
<v:f eqn="sum @8 21600 0"/>
|
||||
<v:f eqn="prod @7 21600 pixelHeight"/>
|
||||
<v:f eqn="sum @10 21600 0"/>
|
||||
</v:formulas>
|
||||
<v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>
|
||||
<o:lock v:ext="edit" aspectratio="t"/>
|
||||
</v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" style='width:293.25pt;
|
||||
height:220.5pt' o:ole="">
|
||||
<v:imagedata src="./Getting%20Started%20Tutorial_files/image001.png" o:title=""/>
|
||||
</v:shape><![endif]--><![if !vml]><img width=391 height=294
|
||||
src="./Getting%20Started%20Tutorial_files/image002.jpg" v:shapes="_x0000_i1025"><![endif]><!--[if gte mso 9]><xml>
|
||||
<o:OLEObject Type="Embed" ProgID="Photoshop.Image.5" ShapeID="_x0000_i1025"
|
||||
DrawAspect="Content" ObjectID="_1074952783">
|
||||
</o:OLEObject>
|
||||
</xml><![endif]--></p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal><span style='mso-tab-count:1'> </span>Now pull
|
||||
the edges out by clicking outside of the box and dragging outward.<span
|
||||
style="mso-spacerun: yes"> </span></p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal><!--[if gte vml 1]><v:shape id="_x0000_i1026" type="#_x0000_t75"
|
||||
style='width:298.5pt;height:213.75pt' o:ole="">
|
||||
<v:imagedata src="./Getting%20Started%20Tutorial_files/image003.png" o:title=""/>
|
||||
</v:shape><![endif]--><![if !vml]><img width=398 height=285
|
||||
src="./Getting%20Started%20Tutorial_files/image004.jpg" v:shapes="_x0000_i1026"><![endif]><!--[if gte mso 9]><xml>
|
||||
<o:OLEObject Type="Embed" ProgID="Photoshop.Image.5" ShapeID="_x0000_i1026"
|
||||
DrawAspect="Content" ObjectID="_1074952784">
|
||||
</o:OLEObject>
|
||||
</xml><![endif]--></p>
|
||||
|
||||
<p class=MsoNormal style='text-indent:.5in'>When you’ve got the box in the
|
||||
shape that you want press the escape button.<span style="mso-spacerun: yes">
|
||||
</span>Notice the brush is no longer highlighted.</p>
|
||||
|
||||
<p class=MsoNormal style='text-indent:.5in'><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal style='text-indent:.5in'><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal><span style='mso-tab-count:1'> </span>To select a
|
||||
brush for modifications, hold down shift and click in the center of the
|
||||
brush.<span style="mso-spacerun: yes"> </span>You can also deselect a brush
|
||||
the same way.<span style="mso-spacerun: yes"> </span>Pressing escape deselects
|
||||
all of the selected brushes.<span style='mso-tab-count:1'> </span></p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal><span style="mso-spacerun: yes"> </span><!--[if gte vml 1]><v:shape
|
||||
id="_x0000_i1027" type="#_x0000_t75" style='width:304.5pt;height:236.25pt'
|
||||
o:ole="">
|
||||
<v:imagedata src="./Getting%20Started%20Tutorial_files/image005.png" o:title=""/>
|
||||
</v:shape><![endif]--><![if !vml]><img width=406 height=315
|
||||
src="./Getting%20Started%20Tutorial_files/image006.jpg" v:shapes="_x0000_i1027"><![endif]><!--[if gte mso 9]><xml>
|
||||
<o:OLEObject Type="Embed" ProgID="Photoshop.Image.5" ShapeID="_x0000_i1027"
|
||||
DrawAspect="Content" ObjectID="_1074952785">
|
||||
</o:OLEObject>
|
||||
</xml><![endif]--></p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal><span style='mso-tab-count:1'> </span>This is
|
||||
basic brush manipulation.<span style="mso-spacerun: yes"> </span>Now you’ll
|
||||
learn how to focus the camera on the brush.<span style="mso-spacerun: yes">
|
||||
</span>This is the camera:</p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal><span style="mso-spacerun: yes"> </span><!--[if gte vml 1]><v:shape
|
||||
id="_x0000_i1028" type="#_x0000_t75" style='width:84pt;height:81.75pt' o:ole="">
|
||||
<v:imagedata src="./Getting%20Started%20Tutorial_files/image007.png" o:title=""/>
|
||||
</v:shape><![endif]--><![if !vml]><img width=112 height=109
|
||||
src="./Getting%20Started%20Tutorial_files/image008.jpg" v:shapes="_x0000_i1028"><![endif]><!--[if gte mso 9]><xml>
|
||||
<o:OLEObject Type="Embed" ProgID="Photoshop.Image.5" ShapeID="_x0000_i1028"
|
||||
DrawAspect="Content" ObjectID="_1074952786">
|
||||
</o:OLEObject>
|
||||
</xml><![endif]--></p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal style='text-indent:.5in'>If you can’t find the camera scroll
|
||||
the 2dmap around by holding the right click and moving the mouse.<span
|
||||
style="mso-spacerun: yes"> </span>Use the Mouse-wheel to zoom in and out.<span
|
||||
style="mso-spacerun: yes"> </span>If you don’t have a mouse wheel use the
|
||||
insert and delete keys.<span style="mso-spacerun: yes"> </span>Pressing Alt+x
|
||||
will center the 2d view on the current selected brush.<span
|
||||
style="mso-spacerun: yes"> </span>Since you don’t have any brushes selected
|
||||
pressing Alt+x will center the 2d view on the camera.</p>
|
||||
|
||||
<p class=MsoNormal style='text-indent:.5in'><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal style='text-indent:.5in'>Notice the two lines coming out of
|
||||
the camera.<span style="mso-spacerun: yes"> </span>These lines show the
|
||||
camera’s field of view.<span style="mso-spacerun: yes"> </span>You can point
|
||||
your camera by middle-clicking in the 2d view.</p>
|
||||
|
||||
<p class=MsoNormal style='text-indent:.5in'><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal style='text-indent:.5in'><!--[if gte vml 1]><v:shape id="_x0000_i1029"
|
||||
type="#_x0000_t75" style='width:293.25pt;height:244.5pt' o:ole="">
|
||||
<v:imagedata src="./Getting%20Started%20Tutorial_files/image009.png" o:title=""/>
|
||||
</v:shape><![endif]--><![if !vml]><img width=391 height=326
|
||||
src="./Getting%20Started%20Tutorial_files/image010.jpg" v:shapes="_x0000_i1029"><![endif]><!--[if gte mso 9]><xml>
|
||||
<o:OLEObject Type="Embed" ProgID="Photoshop.Image.5" ShapeID="_x0000_i1029"
|
||||
DrawAspect="Content" ObjectID="_1074952787">
|
||||
</o:OLEObject>
|
||||
</xml><![endif]--></p>
|
||||
|
||||
<p class=MsoNormal style='text-indent:.5in'><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal style='text-indent:.5in'>Notice your camera’s Field of view
|
||||
lines change.</p>
|
||||
|
||||
<p class=MsoNormal style='text-indent:.5in'><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal style='text-indent:.5in'><!--[if gte vml 1]><v:shape id="_x0000_i1030"
|
||||
type="#_x0000_t75" style='width:289.5pt;height:235.5pt' o:ole="">
|
||||
<v:imagedata src="./Getting%20Started%20Tutorial_files/image011.png" o:title=""/>
|
||||
</v:shape><![endif]--><![if !vml]><img width=386 height=314
|
||||
src="./Getting%20Started%20Tutorial_files/image012.jpg" v:shapes="_x0000_i1030"><![endif]><!--[if gte mso 9]><xml>
|
||||
<o:OLEObject Type="Embed" ProgID="Photoshop.Image.5" ShapeID="_x0000_i1030"
|
||||
DrawAspect="Content" ObjectID="_1074952788">
|
||||
</o:OLEObject>
|
||||
</xml><![endif]--></p>
|
||||
|
||||
<p class=MsoNormal style='text-indent:.5in'><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal style='text-indent:.5in'>And your 3d view is now updated.</p>
|
||||
|
||||
<p class=MsoNormal style='text-indent:.5in'><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal style='text-indent:.5in'><!--[if gte vml 1]><v:shape id="_x0000_i1031"
|
||||
type="#_x0000_t75" style='width:327pt;height:110.25pt' o:ole="">
|
||||
<v:imagedata src="./Getting%20Started%20Tutorial_files/image013.png" o:title=""/>
|
||||
</v:shape><![endif]--><![if !vml]><img width=436 height=147
|
||||
src="./Getting%20Started%20Tutorial_files/image014.jpg" v:shapes="_x0000_i1031"><![endif]><!--[if gte mso 9]><xml>
|
||||
<o:OLEObject Type="Embed" ProgID="Photoshop.Image.5" ShapeID="_x0000_i1031"
|
||||
DrawAspect="Content" ObjectID="_1074952789">
|
||||
</o:OLEObject>
|
||||
</xml><![endif]--></p>
|
||||
|
||||
<p class=MsoNormal style='text-indent:.5in'><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal style='text-indent:.5in'>If at any point your camera is off
|
||||
looking at gray (void) space you can reposition it in the 2d view.</p>
|
||||
|
||||
<p class=MsoNormal style='text-indent:.5in'><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal style='text-indent:.5in'>You’re going to control your camera
|
||||
mostly within the 3d view but when starting a map it’s easiest to first
|
||||
position the camera in the 2d view.<span style="mso-spacerun: yes"> </span>Now
|
||||
you’ll move on to 3d camera manipulation.</p>
|
||||
|
||||
<p class=MsoNormal style='text-indent:.5in'><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal style='text-indent:.5in'>There are a few different camera
|
||||
modes they can be selected by clicking on the camera eye icon in the tool bar.
|
||||
Click on it and watch it cycle through the different modes.<span
|
||||
style="mso-spacerun: yes"> </span></p>
|
||||
|
||||
<p class=MsoNormal style='text-indent:.5in'><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal><!--[if gte vml 1]><v:shape id="_x0000_i1032" type="#_x0000_t75"
|
||||
style='width:373.5pt;height:29.25pt' o:ole="">
|
||||
<v:imagedata src="./Getting%20Started%20Tutorial_files/image015.png" o:title=""/>
|
||||
</v:shape><![endif]--><![if !vml]><img width=498 height=39
|
||||
src="./Getting%20Started%20Tutorial_files/image016.jpg" v:shapes="_x0000_i1032"><![endif]><!--[if gte mso 9]><xml>
|
||||
<o:OLEObject Type="Embed" ProgID="Photoshop.Image.5" ShapeID="_x0000_i1032"
|
||||
DrawAspect="Content" ObjectID="_1074952790">
|
||||
</o:OLEObject>
|
||||
</xml><![endif]--></p>
|
||||
|
||||
<p class=MsoNormal style='text-indent:.5in'><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal><!--[if gte vml 1]><v:shape id="_x0000_i1033" type="#_x0000_t75"
|
||||
style='width:23.25pt;height:21.75pt' o:ole="">
|
||||
<v:imagedata src="./Getting%20Started%20Tutorial_files/image017.png" o:title=""/>
|
||||
</v:shape><![endif]--><![if !vml]><img width=31 height=29
|
||||
src="./Getting%20Started%20Tutorial_files/image018.jpg" v:shapes="_x0000_i1033"><![endif]><!--[if gte mso 9]><xml>
|
||||
<o:OLEObject Type="Embed" ProgID="Photoshop.Image.5" ShapeID="_x0000_i1033"
|
||||
DrawAspect="Content" ObjectID="_1074952791">
|
||||
</o:OLEObject>
|
||||
</xml><![endif]--></p>
|
||||
|
||||
<p class=MsoNormal>Default mode with the eye and no numbers is classic Q3
|
||||
Radiant mode. Those who have used Q3radiant will be familiar with the camera
|
||||
controls in this mode.</p>
|
||||
|
||||
<p class=MsoNormal><!--[if gte vml 1]><v:shape id="_x0000_i1034" type="#_x0000_t75"
|
||||
style='width:23.25pt;height:21.75pt' o:ole="">
|
||||
<v:imagedata src="./Getting%20Started%20Tutorial_files/image019.png" o:title=""/>
|
||||
</v:shape><![endif]--><![if !vml]><img width=31 height=29
|
||||
src="./Getting%20Started%20Tutorial_files/image020.jpg" v:shapes="_x0000_i1034"><![endif]><!--[if gte mso 9]><xml>
|
||||
<o:OLEObject Type="Embed" ProgID="Photoshop.Image.5" ShapeID="_x0000_i1034"
|
||||
DrawAspect="Content" ObjectID="_1074952792">
|
||||
</o:OLEObject>
|
||||
</xml><![endif]--></p>
|
||||
|
||||
<p class=MsoNormal>The mode with a “1” over the eye is “game mode” and requires
|
||||
button rebinding to work.</p>
|
||||
|
||||
<p class=MsoNormal><!--[if gte vml 1]><v:shape id="_x0000_i1035" type="#_x0000_t75"
|
||||
style='width:23.25pt;height:21.75pt' o:ole="">
|
||||
<v:imagedata src="./Getting%20Started%20Tutorial_files/image021.png" o:title=""/>
|
||||
</v:shape><![endif]--><![if !vml]><img width=31 height=29
|
||||
src="./Getting%20Started%20Tutorial_files/image022.jpg" v:shapes="_x0000_i1035"><![endif]><!--[if gte mso 9]><xml>
|
||||
<o:OLEObject Type="Embed" ProgID="Photoshop.Image.5" ShapeID="_x0000_i1035"
|
||||
DrawAspect="Content" ObjectID="_1074952793">
|
||||
</o:OLEObject>
|
||||
</xml><![endif]--></p>
|
||||
|
||||
<p class=MsoNormal>The mode with a “2” over the eye is the “mode with no name”
|
||||
mode and this is the one I will use for this tutorial since it’s the one that I
|
||||
prefer.<span style="mso-spacerun: yes"> </span></p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal>In the 3d view click and hold your right mouse button, now
|
||||
move the mouse around and see what happens to the camera.<span
|
||||
style="mso-spacerun: yes"> </span>Forward and back move the camera forward and
|
||||
back side-to-side turns the camera view from left to right.</p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal>Now hold down the control button and the right mouse button
|
||||
while moving the mouse.<span style="mso-spacerun: yes"> </span>Moving up and
|
||||
down will move the camera up and down moving side-to-side will strafe the
|
||||
camera.</p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal>Hold down the control button the shift button and the right
|
||||
button and move the camera around. This will be like looking around in the game</p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal>If your ever lost in the gray void you can re-position your
|
||||
camera in the 2d view by CTRL+MIDDLE clicking.<span style="mso-spacerun: yes">
|
||||
</span>Combine that with the middle click to point the camera and you can
|
||||
quickly set your camera anywhere.</p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal>You can edit within the 3d view the same way that you edit
|
||||
in the 2d view.<span style="mso-spacerun: yes"> </span>Just Shift-click the
|
||||
brush to select and pull away from edges.<span style="mso-spacerun: yes">
|
||||
</span>When you want precision or just plain ease of use you’ll edit in the 2d
|
||||
window.</p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal>To edit 3d geometry you’ll need to switch sides in the 2d
|
||||
view. Notice the words “XY Top” in the top left corner of the 2d view</p>
|
||||
|
||||
<p class=MsoNormal><!--[if gte vml 1]><v:shape id="_x0000_i1036" type="#_x0000_t75"
|
||||
style='width:147pt;height:81pt' o:ole="">
|
||||
<v:imagedata src="./Getting%20Started%20Tutorial_files/image023.png" o:title=""/>
|
||||
</v:shape><![endif]--><![if !vml]><img width=196 height=108
|
||||
src="./Getting%20Started%20Tutorial_files/image024.jpg" v:shapes="_x0000_i1036"><![endif]><!--[if gte mso 9]><xml>
|
||||
<o:OLEObject Type="Embed" ProgID="Photoshop.Image.5" ShapeID="_x0000_i1036"
|
||||
DrawAspect="Content" ObjectID="_1074952794">
|
||||
</o:OLEObject>
|
||||
</xml><![endif]--></p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal>Select the brush and Press CTRL+TAB to switch the 2d view to
|
||||
a different side.<span style="mso-spacerun: yes"> </span>When the view
|
||||
switches it will center on the current selected brush or brushes.<span
|
||||
style="mso-spacerun: yes"> </span>If nothing is selected the 2d view will
|
||||
center on the 3d camera.</p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal>Now you’re looking at the front view and it should look
|
||||
something like this:</p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal><!--[if gte vml 1]><v:shape id="_x0000_i1037" type="#_x0000_t75"
|
||||
style='width:312pt;height:232.5pt' o:ole="">
|
||||
<v:imagedata src="./Getting%20Started%20Tutorial_files/image025.png" o:title=""/>
|
||||
</v:shape><![endif]--><![if !vml]><img width=416 height=310
|
||||
src="./Getting%20Started%20Tutorial_files/image026.jpg" v:shapes="_x0000_i1037"><![endif]><!--[if gte mso 9]><xml>
|
||||
<o:OLEObject Type="Embed" ProgID="Photoshop.Image.5" ShapeID="_x0000_i1037"
|
||||
DrawAspect="Content" ObjectID="_1074952795">
|
||||
</o:OLEObject>
|
||||
</xml><![endif]--></p>
|
||||
|
||||
<p class=MsoNormal><span style='mso-tab-count:1'> </span></p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal>Click and drag the edges as you did earlier in the tutorial
|
||||
to make the brush taller.</p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal><b>Section 2</b>: Hollowing a room</p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal>Now that you’ve learned the basics of brush and camera manipulation
|
||||
you can build a room.<span style="mso-spacerun: yes"> </span>Go to the file
|
||||
menu and select New.<span style="mso-spacerun: yes"> </span>If it asks you to
|
||||
copy the selection click on no. </p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal>Start by making your grid size 128 units, do this by
|
||||
pressing the “8” key.<span style="mso-spacerun: yes"> </span>Notice the status
|
||||
window changing at the bottom of the window.<span style="mso-spacerun: yes">
|
||||
</span>It should say “Grid 128”.<span style="mso-spacerun: yes"> </span>The
|
||||
numbers 1-9 change the grid size 1=1, 2=2, 3=4, 4=8, 5=16 etc.</p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal>Switch your view to the top view.</p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal>Draw a box that is 512 x 512 units.<span
|
||||
style="mso-spacerun: yes"> </span>You can use the grid numbers on top and on
|
||||
the side or you can go by how many times the box “snaps”, each snap being the
|
||||
distance of the grid size.<span style="mso-spacerun: yes"> </span>An easier
|
||||
way to measure a brush is to check the “<b>paint sizing info</b>” box in the
|
||||
preferences dialog box.<span style="mso-spacerun: yes"> </span>Find the
|
||||
preferences in the “<b>edit</b>” menu.</p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal><!--[if gte vml 1]><v:shape id="_x0000_i1038" type="#_x0000_t75"
|
||||
style='width:407.25pt;height:99pt' o:ole="">
|
||||
<v:imagedata src="./Getting%20Started%20Tutorial_files/image027.png" o:title=""/>
|
||||
</v:shape><![endif]--><![if !vml]><img width=543 height=132
|
||||
src="./Getting%20Started%20Tutorial_files/image028.jpg" v:shapes="_x0000_i1038"><![endif]><!--[if gte mso 9]><xml>
|
||||
<o:OLEObject Type="Embed" ProgID="Photoshop.Image.5" ShapeID="_x0000_i1038"
|
||||
DrawAspect="Content" ObjectID="_1074952796">
|
||||
</o:OLEObject>
|
||||
</xml><![endif]--></p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal>You’ll now see the measurements on the selected brush or
|
||||
brushes. </p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal>Stretch the brush out until you see this:</p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal><!--[if gte vml 1]><v:shape id="_x0000_i1039" type="#_x0000_t75"
|
||||
style='width:307.5pt;height:243pt' o:ole="">
|
||||
<v:imagedata src="./Getting%20Started%20Tutorial_files/image029.png" o:title=""/>
|
||||
</v:shape><![endif]--><![if !vml]><img width=410 height=324
|
||||
src="./Getting%20Started%20Tutorial_files/image030.jpg" v:shapes="_x0000_i1039"><![endif]><!--[if gte mso 9]><xml>
|
||||
<o:OLEObject Type="Embed" ProgID="Photoshop.Image.5" ShapeID="_x0000_i1039"
|
||||
DrawAspect="Content" ObjectID="_1074952798">
|
||||
</o:OLEObject>
|
||||
</xml><![endif]--></p>
|
||||
|
||||
<p class=MsoNormal>The numbers on the bottom and right sides are the size of
|
||||
the box; the number on the top is the coordinate for the top left corner.</p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal>Switch you’re 2d view (CTRL+TAB) and make the brush 512
|
||||
units tall.</p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal>Now change the grid size to 8 (press 4).</p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal>Press the “<b>hollow</b>” Icon that looks like this:</p>
|
||||
|
||||
<p class=MsoNormal><!--[if gte vml 1]><v:shape id="_x0000_i1040" type="#_x0000_t75"
|
||||
style='width:23.25pt;height:21.75pt' o:ole="">
|
||||
<v:imagedata src="./Getting%20Started%20Tutorial_files/image031.png" o:title=""/>
|
||||
</v:shape><![endif]--><![if !vml]><img width=31 height=29
|
||||
src="./Getting%20Started%20Tutorial_files/image032.jpg" v:shapes="_x0000_i1040"><![endif]><!--[if gte mso 9]><xml>
|
||||
<o:OLEObject Type="Embed" ProgID="Photoshop.Image.5" ShapeID="_x0000_i1040"
|
||||
DrawAspect="Content" ObjectID="_1074952799">
|
||||
</o:OLEObject>
|
||||
</xml><![endif]--></p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal>Your brush will split into 6 brushes and looks like this:</p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal><!--[if gte vml 1]><v:shape id="_x0000_i1041" type="#_x0000_t75"
|
||||
style='width:296.25pt;height:262.5pt' o:ole="">
|
||||
<v:imagedata src="./Getting%20Started%20Tutorial_files/image033.png" o:title=""/>
|
||||
</v:shape><![endif]--><![if !vml]><img width=395 height=350
|
||||
src="./Getting%20Started%20Tutorial_files/image034.jpg" v:shapes="_x0000_i1041"><![endif]><!--[if gte mso 9]><xml>
|
||||
<o:OLEObject Type="Embed" ProgID="Photoshop.Image.5" ShapeID="_x0000_i1041"
|
||||
DrawAspect="Content" ObjectID="_1074952800">
|
||||
</o:OLEObject>
|
||||
</xml><![endif]--></p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal>This is the quick and dirty way of creating a room and is
|
||||
fine for this example.<span style="mso-spacerun: yes"> </span>In creating
|
||||
buildings and such you’ll never use the hollow tool because the hollow tool
|
||||
doesn’t layout the brushes properly.<span style="mso-spacerun: yes"> </span>At
|
||||
each of the edges the brushes overlap. For this example that’s fine because you
|
||||
won’t see the sides of the brush that overlap, but in a level where this room
|
||||
might be visible from outside this will create a problem because two surfaces
|
||||
will be on the same plane. </p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal>Move the camera inside the box (CONTROL+MIDDLE CLICK in the
|
||||
2d view) </p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal>Now the room needs a texture. Go to the <b>Textures</b> menu
|
||||
and select <b>barrel</b>. I’m using Barrel for the tutorial because it’s the
|
||||
smallest texture directory and loads quickly.</p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal>You should see the texture window to the right of the screen
|
||||
fill up with barrel textures.<span style="mso-spacerun: yes"> </span>Chose a
|
||||
texture to place on the wall and left-click it. This is the room, all it needs
|
||||
is a player start position and a light to run it in the game.</p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal><b>Section 3</b>: Adding a player start and a light</p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal>First deselect everything (press Escape).</p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal>After deselecting everything right Click in the 2d window to
|
||||
bring up the entity selection menu.<span style="mso-spacerun: yes"> </span>The
|
||||
menu looks like this:</p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal><!--[if gte vml 1]><v:shape id="_x0000_i1042" type="#_x0000_t75"
|
||||
style='width:189pt;height:213.75pt' o:ole="">
|
||||
<v:imagedata src="./Getting%20Started%20Tutorial_files/image035.png" o:title=""/>
|
||||
</v:shape><![endif]--><![if !vml]><img width=252 height=285
|
||||
src="./Getting%20Started%20Tutorial_files/image036.jpg" v:shapes="_x0000_i1042"><![endif]><!--[if gte mso 9]><xml>
|
||||
<o:OLEObject Type="Embed" ProgID="Photoshop.Image.5" ShapeID="_x0000_i1042"
|
||||
DrawAspect="Content" ObjectID="_1074952801">
|
||||
</o:OLEObject>
|
||||
</xml><![endif]--></p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal>Select Info>Player>Start:</p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal><!--[if gte vml 1]><v:shape id="_x0000_i1043" type="#_x0000_t75"
|
||||
style='width:317.25pt;height:164.25pt' o:ole="">
|
||||
<v:imagedata src="./Getting%20Started%20Tutorial_files/image037.png" o:title=""/>
|
||||
</v:shape><![endif]--><![if !vml]><img width=423 height=219
|
||||
src="./Getting%20Started%20Tutorial_files/image038.jpg" v:shapes="_x0000_i1043"><![endif]><!--[if gte mso 9]><xml>
|
||||
<o:OLEObject Type="Embed" ProgID="Photoshop.Image.5" ShapeID="_x0000_i1043"
|
||||
DrawAspect="Content" ObjectID="_1074952802">
|
||||
</o:OLEObject>
|
||||
</xml><![endif]--></p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal>This places a player starting position where you click.<span
|
||||
style="mso-spacerun: yes"> </span>Now you’ll rearrange that entity.<span
|
||||
style="mso-spacerun: yes"> </span>In the 3d view turn the camera so it’s
|
||||
looking at the ground.<span style="mso-spacerun: yes"> </span>Now hold
|
||||
CTRL+ALT and middle click in the center of the ground surface in the 3d
|
||||
view.<span style="mso-spacerun: yes"> </span></p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal><!--[if gte vml 1]><v:shape id="_x0000_i1044" type="#_x0000_t75"
|
||||
style='width:269.25pt;height:185.25pt' o:ole="">
|
||||
<v:imagedata src="./Getting%20Started%20Tutorial_files/image039.png" o:title=""/>
|
||||
</v:shape><![endif]--><![if !vml]><img width=359 height=247
|
||||
src="./Getting%20Started%20Tutorial_files/image040.jpg" v:shapes="_x0000_i1044"><![endif]><!--[if gte mso 9]><xml>
|
||||
<o:OLEObject Type="Embed" ProgID="Photoshop.Image.5" ShapeID="_x0000_i1044"
|
||||
DrawAspect="Content" ObjectID="_1074952803">
|
||||
</o:OLEObject>
|
||||
</xml><![endif]--></p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal>Deselect the player start position (press Escape).<span
|
||||
style="mso-spacerun: yes"> </span>Right-Click in the 2d view and select “<b>Light”</b>
|
||||
from the menu.<span style="mso-spacerun: yes"> </span>Place the light in the
|
||||
3d view the same way as you placed the player start. You should end up with
|
||||
something that looks like this.</p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal><!--[if gte vml 1]><v:shape id="_x0000_i1045" type="#_x0000_t75"
|
||||
style='width:315pt;height:213pt' o:ole="">
|
||||
<v:imagedata src="./Getting%20Started%20Tutorial_files/image041.png" o:title=""/>
|
||||
</v:shape><![endif]--><![if !vml]><img width=420 height=284
|
||||
src="./Getting%20Started%20Tutorial_files/image042.jpg" v:shapes="_x0000_i1045"><![endif]><!--[if gte mso 9]><xml>
|
||||
<o:OLEObject Type="Embed" ProgID="Photoshop.Image.5" ShapeID="_x0000_i1045"
|
||||
DrawAspect="Content" ObjectID="_1074952804">
|
||||
</o:OLEObject>
|
||||
</xml><![endif]--></p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal>Save this level and you’ll be ready to compile and play in
|
||||
the game.</p>
|
||||
|
||||
<p class=MsoNormal><b><![if !supportEmptyParas]> <![endif]><o:p></o:p></b></p>
|
||||
|
||||
<p class=MsoNormal><b><![if !supportEmptyParas]> <![endif]><o:p></o:p></b></p>
|
||||
|
||||
<p class=MsoNormal><b>Section 4</b>: Compiling and playing</p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal>Compiling is a 3-step process. <b>BSP</b>, <b>VIS</b>, and <b>LIGHT</b>
|
||||
</p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal>Q3map is a command line utility that is used to compile BSP
|
||||
and VIS the map.</p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal>Open a command prompt and run q3map like this</p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal>Q3map –gamedir <base directory of the game> <name
|
||||
of the map></p>
|
||||
|
||||
<p class=MsoNormal>On a machine with MOHAA installed to <b>c:/mohaa</b> and the
|
||||
map named <b>tutorial.map</b> placed in the <b>c:/mohaa/map_source</b>
|
||||
directory the command would look like this:</p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<h1>Q3map –gamedir c:/mohaa c:/mohaa/map_source/tutorial</h1>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal>This compiles the BSP for the map</p>
|
||||
|
||||
<p class=MsoNormal>Compiling Vis is much the same way but with a –vis command
|
||||
attached like this:</p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<h1>Q3map –vis –gamedir c:/mohaa c:/mohaa/map_source/tutorial</h1>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal>Compiling Light is done with a separate program called
|
||||
mohlight; mohlight is run much the same, like this:</p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<h1>Mohlight –gamedir c:/mohaa c:/mohaa/map_source/tutorial</h1>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal>Now copy the resulting .bsp (in this case tutorial.bsp, should
|
||||
be in the same place as the .map file) to your <b>mohaa/main/maps</b> folder. </p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal>Once the .bsp file is in the maps folder it is ready to
|
||||
run.<span style="mso-spacerun: yes"> </span>You’ll have to load MOH in
|
||||
developer mode so that you can use the special developer mode tools.<span
|
||||
style="mso-spacerun: yes"> </span>Load moh from the run menu or a command line
|
||||
like this.</p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal><b>mohaa +set developer 1 +set thereisnomonkey 1 +set cheats
|
||||
1 +set ui_console 1<o:p></o:p></b></p>
|
||||
|
||||
<p class=MsoNormal><b><![if !supportEmptyParas]> <![endif]><o:p></o:p></b></p>
|
||||
|
||||
<p class=MsoNormal>Once in the game you should see the console, it looks like
|
||||
this:</p>
|
||||
|
||||
<p class=MsoNormal><!--[if gte vml 1]><v:shape id="_x0000_i1046" type="#_x0000_t75"
|
||||
style='width:463.5pt;height:326.25pt' o:ole="">
|
||||
<v:imagedata src="./Getting%20Started%20Tutorial_files/image043.png" o:title=""/>
|
||||
</v:shape><![endif]--><![if !vml]><img width=618 height=435
|
||||
src="./Getting%20Started%20Tutorial_files/image044.jpg" v:shapes="_x0000_i1046"><![endif]><!--[if gte mso 9]><xml>
|
||||
<o:OLEObject Type="Embed" ProgID="Photoshop.Image.5" ShapeID="_x0000_i1046"
|
||||
DrawAspect="Content" ObjectID="_1074952805">
|
||||
</o:OLEObject>
|
||||
</xml><![endif]--></p>
|
||||
|
||||
<p class=MsoNormal>If you don’t see the console press the Tilde (`) key to
|
||||
bring it down.</p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal>In the console type “map” followed by a space and then the
|
||||
name of your map, like this:</p>
|
||||
|
||||
<p class=MsoNormal><!--[if gte vml 1]><v:shape id="_x0000_i1047" type="#_x0000_t75"
|
||||
style='width:316.5pt;height:54pt' o:ole="">
|
||||
<v:imagedata src="./Getting%20Started%20Tutorial_files/image045.png" o:title=""/>
|
||||
</v:shape><![endif]--><![if !vml]><img width=422 height=72
|
||||
src="./Getting%20Started%20Tutorial_files/image046.jpg" v:shapes="_x0000_i1047"><![endif]><!--[if gte mso 9]><xml>
|
||||
<o:OLEObject Type="Embed" ProgID="Photoshop.Image.5" ShapeID="_x0000_i1047"
|
||||
DrawAspect="Content" ObjectID="_1074952806">
|
||||
</o:OLEObject>
|
||||
</xml><![endif]--><b><o:p></o:p></b></p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal>After pressing enter you will be able to walk around in the
|
||||
room.</p>
|
||||
|
||||
<p class=MsoNormal><![if !supportEmptyParas]> <![endif]><o:p></o:p></p>
|
||||
|
||||
<p class=MsoNormal>These are the basic steps to getting a map up and running in
|
||||
the game.<span style="mso-spacerun: yes"> </span>From here you should be able
|
||||
to build a simple map.</p>
|
||||
|
||||
</div>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
1352
docs/MOH Miscellaneous Script Documentation.html
Normal file
181
docs/MOH Terrain Editing Manual.html
Normal file
|
@ -0,0 +1,181 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>MOHAA - SDK</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<b><u><font size=+2><center>MOH Terrain System Reference Manual (January 13, 2001)</center></font></u></b>
|
||||
<br>
|
||||
<br>
|
||||
<I><font size=+1>Creating Terrain</font></I>
|
||||
<br>
|
||||
|
||||
<p>
|
||||
1. Draw a brush. The terrain patches have a minimum area of 512x512 units, so drawing brushes larger than this will result in larger patches.<br>
|
||||
<br>
|
||||
a) Go to the LOD Terrain menu. Select “Create from brush.” A terrain patch will appear in place of your original brush.<br>
|
||||
<br>
|
||||
2. To create larger tracts of land, and to build up from a smaller set of terrain patches, you can create multiple separate terrain patches, and then connect them. <br>
|
||||
<br>
|
||||
a) Create several terrain patches apart from each other. The clone key works with terrain patches the same as with brushes, so they can be copied quickly.<br>
|
||||
b) Select and drag one of the patches, and line up one of its sides with another patch. They should be perfectly lined up in the X-Y view, but they only need to be reasonably close in the Z plane. <br>
|
||||
c) Release the dragged patch. If the patches are lined up within the attachment limits, you will get a small dialog:<br>
|
||||
<br>
|
||||
<center><img src="MOH Terrain Editing Manual/1-1.jpg"></center>
|
||||
<br>
|
||||
d) The first two options will force the edge vertices of one patch to meet up with the other. The third option is redundant, as hitting Cancel will do the same thing. Joining patches is essential – there is no reason to have X-Y lined up patches sitting there unconnected!<br>
|
||||
</p>
|
||||
<br>
|
||||
<I><font size=+1>Selecting Terrain</font></I>
|
||||
<br>
|
||||
|
||||
<p>
|
||||
1. Individual Patch Selection: CTRL-SHIFT-Left Click to select one 512x512 patch <br>
|
||||
2. Multiple Patch Selection: Same as #1, repeat as required<br>
|
||||
3. Full Mesh Selection: SHIFT-Left Click to select a whole connected mesh<br>
|
||||
4. Vertex Mode: Select some terrain, press V to go to vertex mode<br>
|
||||
5. Vertex Selection: In Vertex Mode, left click any vertex in 2D/3D windows<br>
|
||||
6. Multiple Vertices: Drag over vertices in 2D, or CTRL-Left Click vertices<br>
|
||||
7. Facet Selection: CTRL-SHIFT-Left click faces when in Facet Mode<br>
|
||||
<br>
|
||||
To disconnect terrain patches from a larger mesh of patches, select the individual patches you want to remove, and press SHIFT-X to separate the patches from the larger mesh. You can now delete the separated patches, or move them somewhere else and reattach them to another continuous mesh. <br>
|
||||
</p>
|
||||
|
||||
<br>
|
||||
<I><font size=+1>Manipulating Terrain Part I – Area Manipulation</font></I>
|
||||
<br>
|
||||
|
||||
<p>
|
||||
1. To raise and lower the terrain over an area, the Area Filter is used. Press SHIFT-A to access the Area Filter dialog:<br>
|
||||
<br>
|
||||
<center><img src="MOH Terrain Editing Manual/1-2.jpg"></center><br>
|
||||
<br>
|
||||
2. The bulginess adjusts how sharply the terrain will slope, and the radius adjusts how many units away from any selected terrain vertices the terrain will be affected. <br>
|
||||
3. Select a vertex or multiple vertices and drag them up or down to shape the terrain in the 2D or 3D preview windows. <br>
|
||||
</p>
|
||||
|
||||
<br>
|
||||
<I><font size=+1>Manipulating Terrain Part II – Vertex Manipulation</font></I>
|
||||
<br>
|
||||
|
||||
<p>
|
||||
1. The vertex manipulation options are in the Move Terrain Vertices dialog. Bring this up by selecting some terrain vertices, and then pressing SHIFT-V. You must have some terrain vertices selected to bring up this dialog:<br>
|
||||
<br>
|
||||
<center><img src="MOH Terrain Editing Manual/1-3.jpg"></center><br>
|
||||
<br>
|
||||
2. The first four options adjust vertex heights of multiple vertices to a uniform elevation; highest means move all selected vertices to the same height as the highest one in the selection, and so on. Smooth is not very effective, and shifts the selected vertices in small increments towards the same result as the Move to Average option. Jitter randomizes the heights of the selected vertices in very small increments. <br>
|
||||
3. Vertices can be frozen into place to avoid unwanted accidental editing changes in your terrain. To lock vertices, select the vertices you want to freeze/unfreeze, go to the LOD Terrain menu, and choose “Lock/Unlock Vertices.” Alternatively, use the Lock/Unlock Vertices toolbar button: <br>
|
||||
<br>
|
||||
<center><img src="MOH Terrain Editing Manual/1-4.jpg"></center><br>
|
||||
</p>
|
||||
|
||||
<br>
|
||||
<I><font size=+1>Manipulating Terrain Part III – Grayscale Image (Height Fields)</font></I>
|
||||
<br>
|
||||
<i>Saving to Image</i><br>
|
||||
<br>
|
||||
<p>
|
||||
1. Terrain can also be edited by painting a grayscale image – a height field - in a paint program. The editor will export and import such images, and apply that information to any terrain in the level.<br>
|
||||
2. To export existing terrain to a height field, terrain must first be selected. Go to the LOD Terrain menu and select “Save to Image.” Enter a filename and save the .TGA file. When this is done, a message will be printed in the editor console window, indicating the scale to which the image should be imported later on: <br>
|
||||
<br>
|
||||
<center><img src="MOH Terrain Editing Manual/1-5.jpg"></center><br>
|
||||
<br>
|
||||
<i>Loading from Image</i><br>
|
||||
<br>
|
||||
1. To import a .TGA, terrain must first be selected. Go to the LOD Terrain menu and select “Load from Image.” This will bring up the Load Terrain From Image dialog:<br>
|
||||
<br>
|
||||
<center><img src="MOH Terrain Editing Manual/1-6.jpg"></center><br>
|
||||
<br>
|
||||
2. To make the imported image translate correctly in the editor (ie: form the terrain at the correct scale), the Custom Blend Function is used. The Image Weight should be set to the scale factor number displayed in the console when the data was exported (see step 2 above.) Leave Existing Weight at 0. Click OK to commit. <br>
|
||||
3. The first three options simply provide additional ways to interpret the imported data.<br>
|
||||
<br>
|
||||
</p>
|
||||
|
||||
<br>
|
||||
<I><font size=+1>Manipulating Terrain Part IV – Facet Manipulation</font></I>
|
||||
<br>
|
||||
|
||||
<p>
|
||||
1. Facet Manipulation is essential both for aesthetics and for reduced polygon counts. It provides direct control over the way any part of the terrain shifts through different levels of detail (LOD.) <br>
|
||||
2. Press SHIFT-F to bring up the Edit Facet Flags dialog:<br>
|
||||
<br>
|
||||
<center><img src="MOH Terrain Editing Manual/1-7.jpg"></center><br>
|
||||
<br>
|
||||
3. You can only select facets (individual triangles of terrain) while the Edit Facet Flags dialog is active.<br>
|
||||
4. To change the properties of the facet(s), select them, and then check the appropriate box. Click Done to exit the dialog.<br>
|
||||
<br>
|
||||
a) Invisible The facet is invisible, but is still there. It can be collided with. It will not affect the LOD of any neighboring facets.<br>
|
||||
b) Delete The facet is removed completely. All neighboring facets will be rendered at maximum detail. This is good for removing terrain under buildings so that the terrain surrounding the building does not morph due to LOD at runtime and appear unusual.<br>
|
||||
c) Important The facet will LOD less aggressively to lower detail levels.<br>
|
||||
d) Trivial The facet will LOD more aggressively to lower detail levels.<br>
|
||||
e) Max Detail: The facet will never LOD to lower detail levels. More polygons.<br>
|
||||
f) No Detail: The facet will always LOD to lower detail levels. Less polygons.<br>
|
||||
</p>
|
||||
|
||||
|
||||
<br>
|
||||
<I><font size=+1>Displaying Terrain </font></I>
|
||||
<br>
|
||||
|
||||
<p>
|
||||
1. LOD Terrain menu: Scale 1 through 4 reduces the number of triangles displayed in the editor, not in the game.<br>
|
||||
2. CTRL-R will toggle the display of any terrain on/off. <br>
|
||||
3. LOD Terrain menu: Shade will display the terrain as Gouraud-shaded<br>
|
||||
4. CTRL-SHIFT-left/right square brackets ([, ]) will limit the distance to which the terrain is drawn when the Terrain Cubic Clip (restricts how much terrain is shown in the editor to enhance performance) button is active:<br>
|
||||
<br>
|
||||
<center><img src="MOH Terrain Editing Manual/1-8.jpg"></center><br>
|
||||
</p>
|
||||
|
||||
<br>
|
||||
<I><font size=+1>Limitations of the Terrain System</font></I>
|
||||
<br>
|
||||
<p>
|
||||
1. The maximum allowable vertical elevation change between any vertices within a 512x512 terrain patch is just under 512 units.<br>
|
||||
2. Terrain can only be formed initially on the X-Y plane.<br>
|
||||
3. Any facet options such as Delete, which affect neighboring facets’ LOD severity, will also influence the LOD of facets further out; there is a minor propagation effect that takes place due to the LOD system. It takes some distance to go from a max detail (many small triangles) portion of terrain to back to normal or to low detail (larger triangles.) <br>
|
||||
4. The facet flag for “Max LOD” makes the affected triangles draw at ter_maxlod = 6, which is the maximum setting. Even though the game defaults to ter_maxlod = 4, these affected triangles will go all the way to ter_maxlod = 6. <br>
|
||||
5. The editor does not interpret and display facets as they are rendered in the actual game. (ie: LOD effects are not shown in the editor.) <br>
|
||||
6. Terrain patches do not block VIS.<br>
|
||||
7. The terrain system also has a max triangle count. If the map has no vis data this defaults to 32768; with vis it defaults to 8192. You can change this with ter_maxtris and a ter_restart (see Console Commands below.)<br>
|
||||
</p>
|
||||
|
||||
<br>
|
||||
<I><font size=+1>Console Commands </font></I>
|
||||
<br>
|
||||
<p>
|
||||
<b>ter_minlod:</b> minimum LOD in the pre-tesselation stage, 0 - 6 (6 = max tesselation) -- requires ter_restart<br>
|
||||
<br>
|
||||
<b>ter_maxlod:</b> maximum LOD in the dynamic tesselation. Precalculated tesselation may exceed this.<br>
|
||||
<br>
|
||||
<b>ter_maxtris:</b> (integer) maximum triangles in the scene. The terrain system will not draw more triangles than this. Requires ter_restart. <br>
|
||||
<br>
|
||||
<b>ter_restart:</b> recalculates the base LOD, and adjusts the maxtris. Automatically happens with a vid_restart.<br>
|
||||
<br>
|
||||
<b>ter_crater:</b> creates a crater in the terrain, part of testing a deformable terrain system<br>
|
||||
<br>
|
||||
<b>ter_count:</b> (0/1) r_speeds for terrain <br>
|
||||
<br>
|
||||
<b>ter_geomorph:</b> (0/1) deactivates the LOD system – all terrain is drawn at full detail<br>
|
||||
<br>
|
||||
<b>ter_error:</b> (0 to 10.0, 10.0 default) adjusts how aggressively the LOD system reduces terrain detail, ranges from 0 to 10.0. Less error = more detail sooner.<br>
|
||||
<br>
|
||||
<b>ter_lock:</b> (0/1) locks display of terrain, to show effects of view frustrum culling (any terrain not visible to the engine from the current viewpoint is removed to improve polygon counts)<br>
|
||||
<br>
|
||||
<b>ter_cull:</b> (0/1) disables the view frustrum culling; all terrain is drawn regardless of visibility<br>
|
||||
</p>
|
||||
</body>
|
||||
|
||||
|
||||
|
||||
<p>
|
||||
|
||||
</p>
|
||||
|
||||
|
||||
|
||||
<pre>
|
||||
<i><font color=blue>
|
||||
|
||||
</font>
|
||||
</i>
|
||||
</pre>
|
223
docs/MOH particles.html
Normal file
|
@ -0,0 +1,223 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>MOHAA - SDK</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<b><u><font size=+2><center>Particles and Emitters</center></font></u></b>
|
||||
<br>
|
||||
<center>Last Updated: December 11, 2002</center>
|
||||
<br>
|
||||
<br>
|
||||
|
||||
<b><font size=+1>Overview</font></b>
|
||||
<p>
|
||||
This document provides an overview of the Ghost Particle System. It should be used with the document title “Client Side Commands” to get the full list of functionality.<br>
|
||||
<br>
|
||||
The functionality of Ghost resides in the client side game DLL (cgame DLL) and particle systems are defined in the client commands and init sections of TIKI files. Every Ghost system is defined in a TIKI file. In some cases the model of the TIKI file is hidden and not used, so we just get a pure particle system from the TIKI with no animations. <br>
|
||||
<br>
|
||||
The nimation alias system can be used to define different particle systems in 1 TIKI file. For example: blah.tik can have 3 different client side animations: smoke, fire, blaze. These 3 animations can have different commands associated with them which will be executed on the client when its frame is played.<br>
|
||||
</p>
|
||||
|
||||
<b><font size=+1>Example</font></b>
|
||||
<p>
|
||||
Here’s an example of a animation block in the crossbow.tik model. We will be analyzing the client commands that are in the “fire” animation. The lines are numbered for reference and is not included in the TIKI file.
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
<i><font color=blue>
|
||||
1. animations
|
||||
2. {
|
||||
3. idle idle.skc
|
||||
4. fire fire.skc
|
||||
5. {
|
||||
6. server
|
||||
a. {
|
||||
b. first shoot
|
||||
c. }
|
||||
7. client
|
||||
a. {
|
||||
b. first sound $xbowdir$/alt4.wav 1
|
||||
c. 2 tagspawn tag_barrel
|
||||
d. (
|
||||
e. count 5
|
||||
f. model crossbow_exhaust.spr
|
||||
g. life 1.00
|
||||
h. accel 0.00 0.00 50.00
|
||||
i. scalerate -0.01
|
||||
j. radius 5.00
|
||||
k. randvel crandom 10.00 crandom 5.00 crandom 20.00
|
||||
l. scalemin 0.15
|
||||
m. scalemax 0.50
|
||||
n. sphere
|
||||
o. fade
|
||||
p. )
|
||||
q. 1 sound $xbowdir$/charge1a.wav 2 .5
|
||||
r. }
|
||||
8. }
|
||||
9. }
|
||||
</font>
|
||||
</i>
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
Line 4 is the beginning of a new animation. The alias for the animation is ‘fire’ and the animation file is ‘fire.skc’. Line 5 is the begin block of the animation commands. Line 6a-c define the server commands that will be executed when the frame is played.<br>
|
||||
<br>
|
||||
Line 7 is the beginning of the client commands section. Line 7b denotes a sound effect that will be played on the first frame. 7c is the command that defines a particle system to be spawned on the 2nd frame of the animation. The tagspawn command is used to spawn particles (or tempmodels) from a specified location. The ‘(‘ on line 7d denotes the beginning of a block of ‘modifiers’ and ‘properties’ that the particle system will have.<br>
|
||||
<br>
|
||||
Since this particle system is created on a specific frame of animation, it is called a <b>“Spawned Particle System.”</b> There are other particle systems called <b>“Emitters”</b> that wll be discussed below. <br>
|
||||
<br>
|
||||
The tagspawn command takes 1 parameter which is the name of the tag that the origin of the particle system starts at. In this example tag_barrel is used (it’s the end of the crossbow). The next set of ‘modifiers’ can be placed in any order after the opening ‘(‘. Each command will modify the particle system in a different way. Combining these modifiers in different ways can lead to an unlimited method of creating special effects.<br>
|
||||
<br>
|
||||
The first parameter is <b>‘count.’</b> This is the number of particles that will be spawned in this system. The second command is <b>‘model’</b> which lets the system know which model the particle system should be made from. In the example it’s crossbow_exhaust.spr. This is a sprite model which will be talked about later. The model can also be another TIKI file. Line 7g has the <b>‘life’</b> command. This is the amount of time (in seconds) each spawned particle will live. When a particle’s life runs out, it is removed from the system. The next command is <b>‘accel’</b> which is short for acceleration. This defines the acceleration of the particle. In this case it’s 50 units in the Upward Z direction. Accel is always relative to the world’s coordinate system and is independent of the parent model’s orientation. <br>
|
||||
<br>
|
||||
The rest of the commands are outlined in the “Client Side Commands” document.<br>
|
||||
<br>
|
||||
As you may be able to tell, this particle system defines a 5 puffs of smoke that will appear at the barrel of the gun and slowly rise upward for 1 second. The <b>‘randvel’</b> command gives them a slight variation in velocity when they are spawned so they spread apart in a natural way. The <b>‘fade’</b> command will allow them to fade out over their life time. This gives a nice effect of smoke dissipating away in the game.<br>
|
||||
</p>
|
||||
|
||||
<b><font size=+1>Emitters</font></b>
|
||||
<p>
|
||||
As mentioned above “Spawned Particle Systems” are associated with animations. Basically they are used to create effects that happen on a certain frame of an animation. Emitters are an entirely different system. They are particle emittters that never “shut off” unless you tell them to. Instead of a <b>‘count’</b> command they use a <b>‘spawnrate’</b> command. This is used to set the rate at which the emitter will emit particles<br>
|
||||
<br>
|
||||
Since emitters are not tied to animations (although they may be controlled by them – see below) they are defined in the <b>Init</b> section of the TIKI file. Here’s an example of an emitter:<br>
|
||||
</p>
|
||||
<pre>
|
||||
<i><font color=blue>
|
||||
a. init
|
||||
b. {
|
||||
c. client
|
||||
d. {
|
||||
e. tagemitter tag_weldsparks sparks
|
||||
a. (
|
||||
b. model weldsparks.spr
|
||||
c. spawnrate 150
|
||||
d. velocity 1
|
||||
e. randvel crandom 1 crandom 1 crandom 1
|
||||
f. scale .02
|
||||
g. life 1.5
|
||||
h. offset random 1 random 1 random 1
|
||||
i. )
|
||||
j. }
|
||||
k. }
|
||||
</font>
|
||||
</i>
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
It’s similar to the Spawned Particle system above, but a little different. The command is called tagemitter and it takes 2 parameters. The first parameter is the tag name. This is the same as the tag name that is used in the spawned system above. The second parameter is the name of the emitter. The name is used to control the emitter in an animation.<br>
|
||||
<br>
|
||||
Another difference in this emitter is the ‘spawnrate’ command. This is used to control the number of particles per second that are emitted in this system. This ‘sparks’ emitter will spawn 150 particles a second! <br>
|
||||
<br>
|
||||
Most of the other commands are identical to the spawned system and will effect the system the same way. You may also have more than 1 emitter in the init section. This allows you to combine systems in one model file.<br>
|
||||
</p>
|
||||
|
||||
<b><font size=+1>Controlling Emitters</font></b>
|
||||
<p>
|
||||
To control an emitter you can use the ‘emitteron’ and ‘emitteroff’ commands in an animation. Here’s an example:
|
||||
</p>
|
||||
<pre>
|
||||
<i><font color=blue>
|
||||
animations
|
||||
{
|
||||
client
|
||||
{
|
||||
turn_on idle.skc
|
||||
{
|
||||
client
|
||||
{
|
||||
emitteron sparks
|
||||
}
|
||||
}
|
||||
turn_off idle.skc
|
||||
{
|
||||
client
|
||||
{
|
||||
emitteroff sparks
|
||||
}
|
||||
}
|
||||
</font>
|
||||
</i>
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
If you wanted to make this emitter turn on, use the level’s script file to play the ‘turn_on’ animation. To turn off the emitter simply play the ‘turn_off’ animation. This model doesn’t really have an animation, it just uses a dummy model with the idle.skc animation. Although you can have emitters on models with animation.
|
||||
</p>
|
||||
|
||||
<b><font size=+1>Sprites</font></b>
|
||||
<p>
|
||||
Sprites are derived from shaders. To make a particle system use a sprite, set the model to the name of the shader appended with a .spr (E.g. weldsparks.spr). This will render a sprite with the specified shader.<br>
|
||||
<br>
|
||||
The default size of the sprite will be equal to the size of the base texturemap. but these can be modified with the <b>‘spritescale’</b> shader command. The <b>‘spritegen’</b> shader command is used to create the type of sprite to display (parallel, parallel_oriented, oriented, and parallel_upright).<br>
|
||||
</p>
|
||||
|
||||
|
||||
<b><font size=+1>Developing Particle Systems</font></b>
|
||||
<p>
|
||||
Particle systems can be created using an in game menu called “Emitter”. This menu allows the developer to interactively adjust the parameters of a particle system and then save them out for later use in the game. <br>
|
||||
<br>
|
||||
To bring up this menu, it is advised that you bind a key to it. To bind it to the F1 key, issue the following command: bind f1 pushmenu emitter<br>
|
||||
<br>
|
||||
Fundamentally there are two different types of particle systems, emitters and spawns. Emitters are persistant and are activated and deactivated by command. Spawners are one shot emissions that take place at key events. Generally models use spawners more often than emitters.<br>
|
||||
<b>The testemitter menu does not cover all of the available commands that can be used – refer to the Client Side Commands.doc for the full list of commands that may be applied to emitters.</b><br>
|
||||
<br>
|
||||
The first step in creating an emitter or spawner is to place the emitter on the ground in front of you. This can be done by pressing the “Place Emitter” button on the Emitter menu. This will create a default emitter out in front of the camera. You can now adjust the parameters of the emitter using the ‘emitter’ menu. <br>
|
||||
<br>
|
||||
Here’s a screenshot of what the menu looks like:<br>
|
||||
<br>
|
||||
<img src="MOH particles/1-1.jpg"><br>
|
||||
<br>
|
||||
This menu allows you to modify some of the properties of emitters to test out different values. The first thing you should do is set the model to a valid value. The test emitter will update automatically as you type into the menu, so you may see some error messages while updating the values. Here’s a quick rundown of what the buttons and sliders change. All of the commands are in the document
|
||||
<br>
|
||||
</p>
|
||||
|
||||
<ul>
|
||||
<li><b>model</b> – The model that the emitter will emit.
|
||||
<li><b>spawnrate</b> – The rate at which the emitter emits (this is number of models per second). This overrides any value set in the “count” field.
|
||||
<li><b>Count</b> – How many models to emit at one time. This is only valid for non-spawnrate emitters, like spawners.
|
||||
<li><b>life</b> – The amount of time in seconds the emitted model will live.
|
||||
<li><b>Spawnrange</b> – the minimum and maximum distance in which models will be spawned. This allows you to control the culling distance of the spawned models.
|
||||
<li><b>Delay</b> – how long to delay before starting to spawn. Used in multi-stacked emitters on the same model, triggered from the same animation.
|
||||
<li><b>Red, Green, Blue</b> – the color of the emitted particles/models. In order for this to work, the shader parameters of the emitted particles/models must support it properly.
|
||||
<li><b>Varycolor</b> – randomly perturb the color between 80% and 100% of its set value.
|
||||
<li><b>Flicker</b> – randomly modulate the visibility of the emitted model. Think of a firefly.
|
||||
<li><b>alpha</b> – The alpha of the emitted model. In order for this to work, the shader parameters of the emitted particles/models must support it properly.
|
||||
<li><b>Fadein time</b> – how long it should take to fade in the emitted model
|
||||
<li><b>Fade delay</b> – how long to wait before starting to fade out the model
|
||||
<li><b>Fade</b> – whether or not to fade out the model. The timing of the model is based off of life and Fade delay.
|
||||
<li><b>Pitch, Yaw, Roll</b> – Set the angles of the emitted models. The first column represents the base values. The second column is the offset. The final value will be a random value between [base] and [base + offset]. In order to specify a range between (-10) and (10), a base of -10 would be specified with an offset of 20. To specify a range between 20 and 60, a base of 20 would be specified with an offset of 60.
|
||||
<li><b>AvelP, AVelY, AvelR</b> – Set the angular velocity of the emitted models. The first column represents the base values. The second column is the offset. The final value will be a random value between [base] and [base + offset].
|
||||
<li><b>RandRoll</b> – give the emitted model a random roll. This is obsolete considering you have perfect control over the Roll from above.
|
||||
<li><b>Die Touch</b> – When collision is on and the emitted model touches something, kill it.
|
||||
<li><b>Collision</b> – Perform collision on each emitted model. NOTE: This can be expensive.
|
||||
<li><b>scale</b> – The scale of the emitted model.
|
||||
<li><b>scalemin / scalemax</b> – The min/max scale of the model. The scale will be randomized between the 2 specified values
|
||||
<li><b>scalerate</b> – This is the rate at which the model will scale in size. If you specify a negative number the model will shrink.
|
||||
<li><b>Alignstretch</b> – align the model along the path of movement and stretch it in that direction based on its current speed and the value of this scalar.
|
||||
<li><b>Align</b> – align the model along the path of movement.
|
||||
<li><b>forwardvel</b> – This will be the forward velocity of the emitted models in the direction of the orientation of the parent model.
|
||||
<li><b>pitch / yaw / roll</b> – Sets the angles of the emitted models. The 3 items to the left of the sliders is No,Cr,and Ra. This stands for No Random, Crandom, and Random. The No means that no randomness will be applied to the emitted model. Cr means that the angles will be randomized between –value and +value. Ra means that the angle will be randomized between 0 and +value.
|
||||
<li><b>randvelx / randvely / randvelz</b> – Applies a velocity to the emitted model. The No,Cr, and Ra are applied the same as mentioned above. These velocities are applied to the world orientation. For example: the setting randvelz to 100 means that the emitter will have 100 velocity in the up direction with respect to the world
|
||||
<li><b>randorgx / randorgy / randorgz</b> – applies an origin offset from the normal origin of the spawned entity. This is relative to the world. If you want to set an offset that is relative to the model, use the command: ‘offsetalongaxis.’
|
||||
<li><b>acceleration</b> – This is the vector specifying the direction that the emitted models will accelerate. This is relative to the world axis.
|
||||
<li><b>sphereradius</b> – This is used to spawn models in a sphere around the point of origin. This radius specifies how far from the origin the model will spawn.
|
||||
<li><b>fade / flicker / randroll / sphere / insphere / align</b> – These flags are used to set some of the effects on the spawned models.
|
||||
<li><b>dumpemitter</b> – This allows the user to dump out the current state of the testemitter to get the commands. This allows you to cut and paste the commands directly into a TIKI file.
|
||||
|
||||
</ul>
|
||||
</body>
|
||||
|
||||
|
||||
|
||||
<p>
|
||||
|
||||
</p>
|
||||
|
||||
|
||||
|
||||
<pre>
|
||||
<i><font color=blue>
|
||||
|
||||
</font>
|
||||
</i>
|
||||
</pre>
|
209
docs/MOH_AI_tips.html
Normal file
|
@ -0,0 +1,209 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>MOHAA - SDK</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<b><u><font size=+2>Pathnode Flags</font></u></b>
|
||||
<br>
|
||||
<p>
|
||||
DONT_LINK<br>
|
||||
- Marks the node as not linking into navigation. Conserves memory and cpu usage.
|
||||
<br>
|
||||
<br>
|
||||
DUCK<br>
|
||||
- Tells the AI to duck at this node. Currently only used with cover nodes.
|
||||
<br>
|
||||
<br>
|
||||
COVER<br>
|
||||
- Tells the AI that this node is potentially a cover node. The definition of cover is that the enemy cannot see me. The AI will only consider cover nodes that satisfy leash, mindist, and maxdist constraints. This can target one or more nodes for the AI to randomly step toward when it is ready to attack the player again. If there are no targeted nodes, the AI will try to step out along a path to it’s enemy.
|
||||
<br>
|
||||
<br>
|
||||
CONCEALMENT<br>
|
||||
- Acts just like COVER, except that no sight trace is done to validate that it is in fact cover. This is useful for foliage and short walls and other things that provide some partial cover or make it harder for the player to see through. It can be used with any of the other cover flags, though it really shouldn’t be used with anything except DUCK and possibly CRATE.
|
||||
<br>
|
||||
<br>
|
||||
CORNER_LEFT<br>
|
||||
- Never used with any other flags, except possibly COVER. The COVER flag is assumed, so it is not necessary. Tells the AI to do special corner attack behavior. The corner is to the AI’s left with his back to the wall. The center of the node should be 16 units in from the corner and 16 units out from the wall. The node’s angles should point away from the wall; ie, the way the AI would be facing with his back to the wall.
|
||||
<br>
|
||||
<br>
|
||||
CORNER_RIGHT<br>
|
||||
- Never used with any other flags, except possibly COVER. The COVER flag is assumed, so it is not necessary. Tells the AI to do special corner attack behavior. The corner is to the AI’s right with his back to the wall. The center of the node should be 16 units in from the corner and 16 units out from the wall. The node’s angles should point away from the wall; ie, the way the AI would be facing with his back to the wall.
|
||||
<br>
|
||||
<br>
|
||||
SNIPER<br>
|
||||
- Currently only works with turret attack behavior. Never used with any other flags. Tells the AI that this is a good place to stand still and shoot people. Use at windows, for example. Can also be used to encourage guys to go inside a building to attack a guy shooting out of a window.
|
||||
<br>
|
||||
<br>
|
||||
CRATE<br>
|
||||
- Never used with any other flags, except possibly COVER. The COVER flag is assumed, so it is not necessary. Tells the AI to do special over-the-top attack behavior, as if he were behind a crate. The center of the node should be 16 units back from the crate. The node’s angles should point towards the crate.
|
||||
<br>
|
||||
</p>
|
||||
|
||||
<b><u><font size=+2>AI Parameters</font></u></b>
|
||||
<br>
|
||||
|
||||
<ul>
|
||||
<li>mindist: The AI will run away from its enemy if he is inside this distance. Cover and sniper nodes inside this distance of the enemy are ignored. Must be at least 128 units less than maxdist to get good behavior.
|
||||
<li>maxdist: The AI will charge its enemy if he is ouside this distance. Cover and sniper nodes outside this distance of the enemy are ignored. Must be at least 128 units more than mindist to get good behavior.
|
||||
<li>leash: The AI will not stray more than this distance from its leash home, except for responding to grenades. Cover and sniper nodes outside the leash are ignored. The leash is set at the AI’s spawn point. It can be reset to the AI’s current position at any time with the “resetleash” event. It can be tethered to any entity with the “actor tether any_entity” event. It automatically resets to the AI’s current position when they enter attack mode. You can prevent it from changing with the statement “actor.fixedleash = 1”, and let it change again by “actor.fixedleash = 0”. Fixedleash is ignored by tethers.
|
||||
<li>sight: The AI will not see anything outside this radius.
|
||||
<li>hearing: The AI will not hear anything outside this radius.
|
||||
<li>sound_awareness: The AI notices sounds with this probability. If 0, they will never notice sounds; if 50, they will notice sounds half the time; and if 100, they will always notice sounds. This probability drops off to zero at the outer edge of a sound’s radius.
|
||||
<li>noticescale: This scales how long it takes AI to see an enemy. At 100, it takes 100% as long as normal to see something; at 50, it takes half as long; at 200, it takes twice as long.
|
||||
<li>enemysharerange: The AI will not receive notification that a teammate has a new enemy if outside this radius from his teammate. By default, whenever an AI gets a new enemy, he tells all his buddies within a 512 unit radius or a direct line-of-sight about this fact. Keep in mind that this parameter controls the radius for receiving the notification, not for sending the notification. If set to 0, the default behavior is used, so 1 should be considered the minimum for this parameter.
|
||||
<li>accuracy: Percentage chance for the AI to get a hit against its enemy when shooting, assuming the weapon had no spread and the enemy is in range.
|
||||
<li>ammo_grenade: number of grenades the AI spawns with.
|
||||
<li>gren_awareness: chance the AI will notice a grenade when they see it. This is used to slow down their responsiveness to grenades to make them easier.
|
||||
<li>interval: used to space AI apart when they are moving with each other and when there are a bunch of them attacking the player. Default is 128, but it can be tweaked per guy. Can be set to 0 to allow bunching, but only as a last resort to fix a serious problem.
|
||||
</UL>
|
||||
<br>
|
||||
|
||||
<p>
|
||||
This is not an exhaustive list, but is most of the common parameters.
|
||||
</p>
|
||||
<br>
|
||||
|
||||
<b><u><font size=+2>Leash</font></u></b>
|
||||
<br>
|
||||
|
||||
<p>
|
||||
Leashes reset under the following conditions:
|
||||
</P>
|
||||
<ul>
|
||||
<li>if fixedleash is 0 and the AI enters either turret or cover attack state, the leash home is reset to the AI’s current origin.
|
||||
<li>if the AI is tethered to an entity and that entity moves, the leash home is reset to that entity’s new origin, regardless of the value of fixedleash.
|
||||
<li>if the AI is issued a “resetleash” command, the AI’s leash home is reset to it’s current origin, regardless of the value of fixedleash.
|
||||
|
||||
</Ul>
|
||||
|
||||
<p>
|
||||
The AI can leave their leashes for the following reasons:
|
||||
</P>
|
||||
<ul>
|
||||
<li>They are responding to a grenade.
|
||||
<li>They were issued any of the “moveto” commands in script that tells them to go outside the leash, such as friendly AI following the player.
|
||||
<li>They are following a patrol path that takes them outside their leash.
|
||||
<li>They are running to an alarm node.
|
||||
</Ul>
|
||||
|
||||
<b><u><font size=+2>Enemy Selection</font></u></b>
|
||||
<br>
|
||||
|
||||
<p>
|
||||
The AI picks the current best enemy to attack based on distance to the enemy, the number of other AI that are attacking that particular enemy, the enemy’s weapon, whether or not that enemy is completely visible, and whether or not that enemy is in pain. The AI prefer to not switch enemies, but they will if the new enemy is of enough higher threat.
|
||||
<br>
|
||||
<br>
|
||||
When an AI changes enemy, he transfers perfect knowledge about that enemy’s existence and location to all other AI in his “squad”, if they are within 512 units or line-of-sight and they are not outside their “enemysharerange”. This transfer of information takes place 0.5 seconds after he switches enemies. Each AI that becomes aware of this enemy’s location can now decide to switch to the new enemy, or to continue attacking their current enemy.
|
||||
<br><br>
|
||||
As soon as an AI fires its weapon, all other AI within that weapon’s sound radius immediately know that the weapon was fired and by who and where the shooter was. The weapon sound radius is currently the same for all weapons.
|
||||
</p>
|
||||
<br>
|
||||
|
||||
<b><u><font size=+2>How AI Initially Sees An Enemy</font></u></b>
|
||||
<br>
|
||||
|
||||
<p>
|
||||
Note that this is only how an AI initially detects an enemy; once he has locked on to an enemy, sight is done by a simple traceline, without all this extra checking.
|
||||
<br>
|
||||
<br>
|
||||
AI sight is achieved based on the time it takes to first notice an enemy given the current conditions. This is scaled based on how long it has been since the conditions were last checked to come up with a percentage recognition; for example, if it has been 1 second since we last checked, and it takes 3 seconds to notice the enemy, the percentage recognition increases by 33.3%. When percentage recognition reaches or exceeds 100%, the enemy is sighted.
|
||||
<br>
|
||||
<br>
|
||||
Recognition time is standard at 2 seconds. There are multipliers to this time based on the LMRF function (light, motion, range, fov). The recognition time gets multiplied by all these factors to get the actual recognition time.
|
||||
<br>
|
||||
<br>
|
||||
* The light portion:<br>
|
||||
- if the enemy is the same brightness as self, the light scale is 0.5 for bright areas and 2.0 for dark areas<br>
|
||||
- if the enemy is much brighter than self, the light scale is 0.125<br>
|
||||
- if the enemy is much darker than self, the light scale is 8<br>
|
||||
<br>
|
||||
* The motion portion:<br>
|
||||
- set for players by the state file; ranges from 0.2 for jumping forward to 1.25 for being ducked while not moving<br>
|
||||
- currently not set for AI, so it stays at 1 for AI<br>
|
||||
<br>
|
||||
* The range portion:<br>
|
||||
- function of self's sight range; using a normalized range of 0-1, the scales are as follows:<br>
|
||||
<br>
|
||||
</p>
|
||||
|
||||
<table border=1>
|
||||
<tr>
|
||||
<td>Range</td>
|
||||
<td>Scale</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>0.000</td>
|
||||
<td>0.000</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>0.250</td>
|
||||
<td>0.500</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>0.500</td>
|
||||
<td>0.750</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>0.750</td>
|
||||
<td>1.000</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>1.000</td>
|
||||
<td>2.000</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<p>
|
||||
- the normalized range is current range divided by maximum range. For fogged levels, maximum range is capped to 82.8% of the fog farplane.<br>
|
||||
<br>
|
||||
* The FOV portion:<br>
|
||||
- set to 1 for directly ahead, and increases to 1.25 at periphery<br>
|
||||
<br>
|
||||
In addition to this, there is also a minimum sight time that is a function of FOV. It is almost 0 for directly in front of the AI, and about 1 second for the periphery. This will make the AI turn its head to look at something before seeing it.<br>
|
||||
</p>
|
||||
|
||||
<b><u><font size=+2>Making AI Look Smart</font></u></b>
|
||||
<br>
|
||||
|
||||
<p>
|
||||
Just an un-ordered list of ways to make the AI look smart:
|
||||
</p>
|
||||
|
||||
<ul>
|
||||
<li>Place info_grenadehint entities in doors and windows. These are just point entities that are places through which the AI will try to throw grenades. It has no parameters, and it does not eat up entity count, and it can make the AI seem a lot smarter about its world.
|
||||
<li>Place SNIPER nodes at doors and windows if the AI cannot get there without leaving their leash, or because there is no path, or because the AI does not have an angle to shoot a guy in a building from the street.
|
||||
<li>Place COVER and CONCEALMENT nodes where possible, unless it is going to make the AI want to continually run up and down stairs or frequently switch between nodes.
|
||||
<li>Remove a cover node if it will never be good cover, or if the AI is frequently switching between it and better cover.
|
||||
<li>Make sure you set the angles properly for CORNER, CRATE, and SNIPER nodes.
|
||||
<li>Play with the exact placement and orientation of special nodes to get AI to look good along the most likely (or only) player path. Feel free to nudge the nodes a little if it will make the AI look better.
|
||||
<li>Flag COVER nodes as CORNER_LEFT, CORNER_RIGHT, and CRATE as much as possible.
|
||||
<li>Have cover nodes target one or more other nodes if you want the AI to consistently pop out at a known location. For example, you could put pop-out nodes to the left and right of a pillar that is cover.
|
||||
<li>Whenever possible, spawn guys near the cover you want them to take.
|
||||
<li>Don’t have a bunch of guys in tight spaces. Basically, don’t put a guy in the map who will probably get in the way of other AI. This is particularly a problem if you have an area where all but one guy in a large group can take cover.
|
||||
<li>Don’t give grenades to a bunch of guys right next to each other. Only one or two guys should have grenades, or you’ll get synchronized grenade tossing.
|
||||
<li>Have careful placement of pathnodes! Don’t have pathnodes too near complex terrain / geometry that can cause the AI to get stuck.
|
||||
<li>Don’t spam the AI with movement commands.
|
||||
<li>Pick an appropriate leash, mindist, and maxdist. This is very important! Setting the leash and / or maxdist too small can prevent the AI from getting to cover and consequently cause them look stupid. Only use a small maxdist if you want the AI to charge its enemy.
|
||||
<li>Leave the AI disabled as long as possible (self ai_off). If a guy is in a locked room, leave his AI off until the door is unlocked and / or opened (self ai_on).
|
||||
<li>The lightgrid affects how quickly the AI will see an enemy. If you don’t do a light compile with –extragrid, you are not getting a perfectly accurate idea of how long it takes for the AI to see an enemy.
|
||||
<li>AI that spawns within 1024 units of each other automatically know about each other’s existence, joining “squads”. AI in a squad are not surprised or curious by noises generated by squadmates. Also, only squadmates get the magical “new enemy” notification messages mentioned above.
|
||||
<li>Reduce “enemysharerange” to 1 for guys who are going to blow up the bridge, so that they only run off if the player sees them.
|
||||
</ul>
|
||||
|
||||
|
||||
</body>
|
||||
|
||||
|
||||
<p>
|
||||
|
||||
</p>
|
||||
|
||||
|
||||
|
||||
<pre>
|
||||
<i><font color=blue>
|
||||
|
||||
</font>
|
||||
</i>
|
||||
</pre>
|
1352
docs/MOH_ClientClasses.html
Normal file
550
docs/MOH_ClientGameClasses.html
Normal file
|
@ -0,0 +1,550 @@
|
|||
<HTML>
|
||||
<HEAD>
|
||||
<Title>Client Game Module Classes</Title>
|
||||
</HEAD>
|
||||
<BODY>
|
||||
<H1>
|
||||
<center>Client Game Module Classes</center>
|
||||
</H1>
|
||||
|
||||
<h2> <a name="Class">Class</a></h2>
|
||||
<BLOCKQUOTE>
|
||||
</BLOCKQUOTE>
|
||||
|
||||
<h2> <a name="ClientGameCommandManager">ClientGameCommandManager</a> -> <a href="#Listener">Listener</a> -> <a href="#Class">Class</a></h2>
|
||||
<BLOCKQUOTE>
|
||||
|
||||
<P><tt><B>(</B></tt><BR>
|
||||
<ul>Signals the beginning of a block of commands</ul>
|
||||
|
||||
<P><tt><B>)</B></tt><BR>
|
||||
<ul>Signals the end of a block of commands</ul>
|
||||
|
||||
<P><tt><B>accel</B>( <i>Float xAcc, Float yAcc, Float zAcc </i>)</tt><BR>
|
||||
<ul>Set the acceleration of the spawned tempmodel.<BR>
|
||||
This acceleration is applied using the world axis</ul>
|
||||
|
||||
<P><tt><B>alias</B>( <i>String alias, String realPath, [ String arg1 ], [ String arg2 ], [ String arg3 ], [ String arg4 ], [ String arg5 ], [ String arg6 ] </i>)</tt><BR>
|
||||
<ul>Create an alias to the specified path</ul>
|
||||
|
||||
<P><tt><B>aliascache</B>( <i>String alias, String realPath, [ String arg1 ], [ String arg2 ], [ String arg3 ], [ String arg4 ], [ String arg5 ], [ String arg6 ] </i>)</tt><BR>
|
||||
<ul>Create an alias to the specified path and cache the resource</ul>
|
||||
|
||||
<P><tt><B>align</B></tt><BR>
|
||||
<ul>Align the tempmodels to the direction they are traveling</ul>
|
||||
|
||||
<P><tt><B>alignonce</B></tt><BR>
|
||||
<ul>Align the tempmodels to the direction they are traveling at the time they are initialized</ul>
|
||||
|
||||
<P><tt><B>alignstretch</B>( <i>[ Float scaleMultiplier ] </i>)</tt><BR>
|
||||
<ul>Aligns the temp model to the direction of travel, and stretches it betwen the last and current positions.<BR>
|
||||
</ul>
|
||||
|
||||
<P><tt><B>alpha</B>( <i>Float alpha </i>)</tt><BR>
|
||||
<ul>Set the alpha of the spawned tempmodel</ul>
|
||||
|
||||
<P><tt><B>alwaysdraw</B></tt><BR>
|
||||
<ul>Set emitter/tempmodel to be alwaysdraw. Which can be turned off by alwaysdraw</ul>
|
||||
|
||||
<P><tt><B>angles</B>( <i>[ String [random|crandom|range] ], Float pitch, [ Float [pitch2] ], [ String [random|crandom|range] ], Float yaw, [ Float [yaw2] ], [ String [random|crandom|range] ], Float roll, [ Float [roll2] ] </i>)</tt><BR>
|
||||
<ul>If random is specified, the component will range from 0 to +specified value.<BR>
|
||||
If crandom is specified, the component will range from -specified to +specified value.<BR>
|
||||
If range is specified, the component needs two values; it will randomly pick a number in the range<BR>
|
||||
from the first number to the first number plus the second number.<BR>
|
||||
If no keyword is explicitly specified, then the component will be just set<BR>
|
||||
without randomness.</ul>
|
||||
|
||||
<P><tt><B>anim</B>( <i>String animation </i>)</tt><BR>
|
||||
<ul>Set a tempmodel the the specified animation</ul>
|
||||
|
||||
<P><tt><B>animateonce</B></tt><BR>
|
||||
<ul>Set a tempmodel to animate once and then get removed</ul>
|
||||
|
||||
<P><tt><B>avelocity</B>( <i>Float yawVel, Float pitchVel, Float rollVel </i>)</tt><BR>
|
||||
<ul>Set the angular velocity of the spawned tempmodel</ul>
|
||||
|
||||
<P><tt><B>beam_offset_endpoints</B></tt><BR>
|
||||
<ul>Make the beams endpoints offset to reduce the bunching up effect</ul>
|
||||
|
||||
<P><tt><B>beamdelay</B>( <i>[ String [random] ], [ Float delay ] </i>)</tt><BR>
|
||||
<ul>Set the delay time between creating new beams.<BR>
|
||||
If the keyword random is specified, the delay between beams will occur randomly between 0 and the time specified</ul>
|
||||
|
||||
<P><tt><B>beamlength</B>( <i>Float length </i>)</tt><BR>
|
||||
<ul>Set the length of the beam or trace length (for decals)</ul>
|
||||
|
||||
<P><tt><B>beampersist</B></tt><BR>
|
||||
<ul>Make the beams persist instead of blinking out</ul>
|
||||
|
||||
<P><tt><B>beamshader</B>( <i>String shadername </i>)</tt><BR>
|
||||
<ul>Set the shader to use for the beam</ul>
|
||||
|
||||
<P><tt><B>beamsphere</B>( <i>Integer count </i>)</tt><BR>
|
||||
<ul>Create a sphere shaped beam effect from the origin. Count is the number of beams</ul>
|
||||
|
||||
<P><tt><B>beamtoggledelay</B>( <i>[ String [random] ], [ Float delay ] </i>)</tt><BR>
|
||||
<ul>Set a delay between toggling the beams on and off.<BR>
|
||||
If the keyword random is specified, the delay between toggling will occur randomly between 0 and the time specified</ul>
|
||||
|
||||
<P><tt><B>blockdlight</B>( <i>Float intensity, Float life, [ String type1 ], [ String type2 ] </i>)</tt><BR>
|
||||
<ul>Spawn a dynamic light from the origin of the model<BR>
|
||||
An additional commands block allows the specification of moving & varying dlights<BR>
|
||||
The intensity is the radius of the light<BR>
|
||||
type is the type of light to create (lensflare,viewlensflare,additive)</ul>
|
||||
|
||||
<P><tt><B>bodyfall</B>( <i>[ Float fVolume ] </i>)</tt><BR>
|
||||
<ul>Play a body fall sound that is appropriate to the surface we are falling on<BR>
|
||||
</ul>
|
||||
|
||||
<P><tt><B>bouncedecal</B>( <i>Integer maxamount, [ Integer temporary ] </i>)</tt><BR>
|
||||
<ul>Put a mark when the tempmodel bounces and hits a surface<BR>
|
||||
maxamount = Max amount of decals to make when bouncing<BR>
|
||||
temporary = specify 1 for a temporary mark that only appears for a short time, 0 for a decal that stays aroung longer (default is 0)<BR>
|
||||
</ul>
|
||||
|
||||
<P><tt><B>bouncefactor</B>( <i>Float factor </i>)</tt><BR>
|
||||
<ul>Set the bounciness of a tempmodel when it hits a solid.<BR>
|
||||
A factor > 1 will make the model bounce higher and higher on each hit</ul>
|
||||
|
||||
<P><tt><B>bouncesound</B>( <i>String sound, [ Float [delay] ] </i>)</tt><BR>
|
||||
<ul>When bouncing, what sound to play on impact and an option delay (default is 1 second) between playing this sound</ul>
|
||||
|
||||
<P><tt><B>bouncesoundonce</B>( <i>String sound </i>)</tt><BR>
|
||||
<ul>When bouncing, what sound to play on impact one time</ul>
|
||||
|
||||
<P><tt><B>cache</B>( <i>String resourceName </i>)</tt><BR>
|
||||
<ul>Cache the specified resource</ul>
|
||||
|
||||
<P><tt><B>cachefont</B>( <i>String fontName </i>)</tt><BR>
|
||||
<ul>Cache the specified font (For menu graphics that should never be picmiped)</ul>
|
||||
|
||||
<P><tt><B>cachefromalias</B>( <i>String alias </i>)</tt><BR>
|
||||
<ul>Caches all data matching a previously specified alias</ul>
|
||||
|
||||
<P><tt><B>cacheimage</B>( <i>String imageName </i>)</tt><BR>
|
||||
<ul>Cache the specified image (For menu graphics that should never be picmiped)</ul>
|
||||
|
||||
<P><tt><B>circle</B></tt><BR>
|
||||
<ul>Set the tempmodels to be spawned in a circle around the origin<BR>
|
||||
This circle will be generated in the X/Y axis of the model</ul>
|
||||
|
||||
<P><tt><B>clampvel</B>( <i>Float minX, Float maxX, Float minY, Float maxY, Float minZ, Float maxZ </i>)</tt><BR>
|
||||
<ul>sets the valid range for velocities along global axes. Cannot be used with clampvelaxis.</ul>
|
||||
|
||||
<P><tt><B>clampvelaxis</B>( <i>Float minX, Float maxX, Float minY, Float maxY, Float minZ, Float maxZ </i>)</tt><BR>
|
||||
<ul>sets the valid range for velocities along oriented axes. Cannot be used with clampvel.</ul>
|
||||
|
||||
<P><tt><B>client</B>( <i>[ String arg1 ], [ String arg2 ], [ String arg3 ], [ String arg4 ], [ String arg5 ], [ String arg6 ] </i>)</tt><BR>
|
||||
<ul>Execute the specified command arg string</ul>
|
||||
|
||||
<P><tt><B>collision</B>( <i>[ String water ] </i>)</tt><BR>
|
||||
<ul>Turn on collision for the tempmodel.<BR>
|
||||
If the keyword water is specified, then the tempmodel will collide with water</ul>
|
||||
|
||||
<P><tt><B>color</B>( <i>Float red, Float green, Float blue, [ Float alpha ] </i>)</tt><BR>
|
||||
<ul>Set the color (modulate) of the spawned tempmodel.</ul>
|
||||
|
||||
<P><tt><B>colorvelocity</B>( <i>Float rVel, Float gVel, Float bVel </i>)</tt><BR>
|
||||
<ul>Set the color velocity of the spawned dlight tempmodel</ul>
|
||||
|
||||
<P><tt><B>commanddelay</B>( <i>Float delay, String command, [ String [arg1] ], [ String [arg2] ], [ String [arg3] ], [ String [arg4] ], [ String [arg5] ], [ String [arg6] ] </i>)</tt><BR>
|
||||
<ul>executes a command after the given delay</ul>
|
||||
|
||||
<P><tt><B>cone</B>( <i>Float height, Float radius </i>)</tt><BR>
|
||||
<ul>Randomly spawns the particle somewhere inside a cone along the model's local x axis</ul>
|
||||
|
||||
<P><tt><B>count</B>( <i>Integer count </i>)</tt><BR>
|
||||
<ul>Set the number of tempmodels that are spawned<BR>
|
||||
This is only used for the originspawn and tagspawn commands,<BR>
|
||||
and not for emitters, use spawnrate instead</ul>
|
||||
|
||||
<P><tt><B>decalradius</B>( <i>Float radius </i>)</tt><BR>
|
||||
<ul>Set the radius of the decal</ul>
|
||||
|
||||
<P><tt><B>decalshader</B>( <i>String shadername </i>)</tt><BR>
|
||||
<ul>Set the shader to use for the impact decal</ul>
|
||||
|
||||
<P><tt><B>delayedrepeat</B>( <i>Float time, Integer commandnumber, [ String [arg1] ], [ String [arg2] ], [ String [arg3] ], [ String [arg4] ], [ String [arg5] ], [ String [arg6] ] </i>)</tt><BR>
|
||||
<ul>Set the time delay between this command getting executed. This requires a command number to be assigned here.<BR>
|
||||
This is internally used to keep track of the commands this entity executes and will resolve naming conflicts.<BR>
|
||||
This is only useful if the command gets called continuously but must execute at regular intervals.<BR>
|
||||
</ul>
|
||||
|
||||
<P><tt><B>delayedsfx</B>( <i>Float fDelay, String sCommand, [ String arg1 ], [ String arg2 ], [ String arg3 ], [ String arg4 ], [ String arg5 ], [ String arg6 ], [ String arg7 ], [ String arg8 ] </i>)</tt><BR>
|
||||
<ul>Used for adding commands to a special effect with a time delay</ul>
|
||||
|
||||
<P><tt><B>detail</B></tt><BR>
|
||||
<ul>Set emitter/tempmodel to be detail. Which can be turned off by detail</ul>
|
||||
|
||||
<P><tt><B>dietouch</B></tt><BR>
|
||||
<ul>Set the spawned tempmodels to die when they touch a solid</ul>
|
||||
|
||||
<P><tt><B>dlight</B>( <i>Float red, Float green, Float blue, Float intensity, [ String type1 ], [ String type2 ] </i>)</tt><BR>
|
||||
<ul>This makes the emitter itself a dynamic lightThe red,green,blue parms are the color of the light<BR>
|
||||
The intensity is the radius of the light<BR>
|
||||
type is the type of light to create (lensflare,viewlensflare,additive)</ul>
|
||||
|
||||
<P><tt><B>emitterangles</B>( <i>[ Float pitchofs ], [ Float yawofs ], [ Float rollofs ] </i>)</tt><BR>
|
||||
<ul>Set the tempmodels angles to that of the emitter<BR>
|
||||
The three optional parameters are for setting an angle offset from the emitter</ul>
|
||||
|
||||
<P><tt><B>emitteroff</B>( <i>String emitterName </i>)</tt><BR>
|
||||
<ul>Turn the specified emitter off</ul>
|
||||
|
||||
<P><tt><B>emitteron</B>( <i>String emitterName </i>)</tt><BR>
|
||||
<ul>Turn the specified emitter on</ul>
|
||||
|
||||
<P><tt><B>endalpha</B>( <i>Float alpha </i>)</tt><BR>
|
||||
<ul>Set the alpha of the beam's endpoint</ul>
|
||||
|
||||
<P><tt><B>entcolor</B>( <i>Float red, Float green, Float blue, [ Float alpha ] </i>)</tt><BR>
|
||||
<ul>Set the color(modulate) of this entity</ul>
|
||||
|
||||
<P><tt><B>eyelimits</B>( <i>Float fPitchmax, Float fYawmax, Float fRollmax </i>)</tt><BR>
|
||||
<ul>Set the max angle offsets for the eyes from the model's head</ul>
|
||||
|
||||
<P><tt><B>eyemovement</B>( <i>Float fMovement </i>)</tt><BR>
|
||||
<ul>Sets the amount of the head's movement to apply to the players view. 1 is full, 0 is none</ul>
|
||||
|
||||
<P><tt><B>fade</B></tt><BR>
|
||||
<ul>Set the tempmodel to fade out over it's life</ul>
|
||||
|
||||
<P><tt><B>fadedelay</B>( <i>Float time </i>)</tt><BR>
|
||||
<ul>Set the amount of time to delay a fade</ul>
|
||||
|
||||
<P><tt><B>fadein</B>( <i>Float time </i>)</tt><BR>
|
||||
<ul>Set the tempmodel to fade in over the specified time</ul>
|
||||
|
||||
<P><tt><B>flicker</B></tt><BR>
|
||||
<ul>Set the tempmodel to change it's alpha every frame. Creates a flickering effect</ul>
|
||||
|
||||
<P><tt><B>footstep</B>( <i>String tag, String sRunning, [ Integer iEquipment ] </i>)</tt><BR>
|
||||
<ul>Play a footstep sound that is appropriate to the surface we are currently stepping on<BR>
|
||||
sRunning should be set to run, walk, or ladder</ul>
|
||||
|
||||
<P><tt><B>friction</B>( <i>Float friction </i>)</tt><BR>
|
||||
<ul>Set the friction as a fraction of velocity per second... exact effect depends on physics rate:<BR>
|
||||
slowdown per second = [1 - (friction / physicsrate)] ^ physicsrate; physicsrate defaults to 10</ul>
|
||||
|
||||
<P><tt><B>globalfade</B>( <i>[ String [in|out] ] </i>)</tt><BR>
|
||||
<ul>Set the tempmodels to globally fade in or out together</ul>
|
||||
|
||||
<P><tt><B>hardlink</B></tt><BR>
|
||||
<ul>Set the tempmodels linked to the model they are spawned from, so they move with it</ul>
|
||||
|
||||
<P><tt><B>inwardsphere</B></tt><BR>
|
||||
<ul>Create the tempmodels in a sphere around the origin, and adjust their<BR>
|
||||
angle so they point toward the center of the sphere. This is best used with a<BR>
|
||||
spehere radius and some velocity so the models look like they're heading toward the<BR>
|
||||
center of the sphere.</ul>
|
||||
|
||||
<P><tt><B>landing</B>( <i>[ Float fVolume ], [ Integer iEquipment ] </i>)</tt><BR>
|
||||
<ul>Play a landing sound that is appropriate to the surface we are landing on<BR>
|
||||
</ul>
|
||||
|
||||
<P><tt><B>life</B>( <i>Float life, [ Float randomlife ] </i>)</tt><BR>
|
||||
<ul>Set the life (in seconds) of the spawned tempmodel</ul>
|
||||
|
||||
<P><tt><B>lightstyle</B>( <i>String nameOfImage </i>)</tt><BR>
|
||||
<ul>Set a lightstyle to determine the color of this tempmodel, the image<BR>
|
||||
specified is used to determine the look of the light style</ul>
|
||||
|
||||
<P><tt><B>loopsound</B>( <i>String soundName, [ Float volume ], [ Float min_distance ], Float pitch </i>)</tt><BR>
|
||||
<ul>Play the specifed sound as a looping sound</ul>
|
||||
|
||||
<P><tt><B>maxoffset</B>( <i>Float maxoffset </i>)</tt><BR>
|
||||
<ul>Set the maximum offset from center in a beam</ul>
|
||||
|
||||
<P><tt><B>minoffset</B>( <i>Float minoffset </i>)</tt><BR>
|
||||
<ul>Set the minimum offset from center in a beam</ul>
|
||||
|
||||
<P><tt><B>model</B>( <i>String modelname1, [ String modelname2 ], [ String modelname3 ], [ String modelname4 ], [ String modelname5 ], [ String modelname6 ] </i>)</tt><BR>
|
||||
<ul>Set the modelname of the tempmodel. If more than 1 model is specified, it will<BR>
|
||||
be randomly chosen when spawned</ul>
|
||||
|
||||
<P><tt><B>notagaxis</B></tt><BR>
|
||||
<ul>Forces the effect to use the model's orientation for randvelaxis and offsetalongaxis</ul>
|
||||
|
||||
<P><tt><B>numsegments</B>( <i>Integer numsegments </i>)</tt><BR>
|
||||
<ul>Set the number of segments in a beam</ul>
|
||||
|
||||
<P><tt><B>offset</B>( <i>[ String [random|crandom|range] ], Float offsetX, [ Float [offsetX2] ], [ String [random|crandom|range] ], Float offsetY, [ Float [offsetY2] ], [ String [random|crandom|range] ], Float offsetZ, [ Float [offsetZ2] ] </i>)</tt><BR>
|
||||
<ul>If random is specified, the component will range from 0 to +specified offset.<BR>
|
||||
If crandom is specified, the component will range from -specified to +specified offset.<BR>
|
||||
If range is specified, the component needs two values; it will randomly pick a number in the range<BR>
|
||||
from the first number to the first number plus the second number.<BR>
|
||||
If no keyword is explicitly specified, then the component will just be added on<BR>
|
||||
without randomness.<BR>
|
||||
This offset is applied using the world axis.</ul>
|
||||
|
||||
<P><tt><B>offsetalongaxis</B>( <i>[ String [crandom|random|range] ], Float offsetx, [ Float [offsetx2] ], [ String [crandom|random|range] ], Float offsety, [ Float [offsety2] ], [ String [crandom|random|range] ], Float offsetz, [ Float [offsetz2] ] </i>)</tt><BR>
|
||||
<ul>If random is specified, the component will range from 0 to specified offset.<BR>
|
||||
If crandom is specified, the component will range from -specified to +specified offset.<BR>
|
||||
If range is specified, the component needs two values; it will randomly pick a number in the range<BR>
|
||||
from the first number to the first number plus the second number.<BR>
|
||||
If no keyword is explicitly specified, then the component will just be added on<BR>
|
||||
without randomness.<BR>
|
||||
This offset is applied using the model's local axis</ul>
|
||||
|
||||
<P><tt><B>orientation</B>( <i>Float degrees </i>)</tt><BR>
|
||||
<ul>Set the degrees to orient the decal. Specify 'random' to use a random orientation</ul>
|
||||
|
||||
<P><tt><B>originbeamemitter</B></tt><BR>
|
||||
<ul>Spawn beams from the origin.<BR>
|
||||
This command is followed by a ( to specify a block of commands that modify the beam</ul>
|
||||
|
||||
<P><tt><B>originbeamspawn</B></tt><BR>
|
||||
<ul>Spawn a beam from the origin.<BR>
|
||||
This command is followed by a ( to specify a block of commands that modify the beam</ul>
|
||||
|
||||
<P><tt><B>origindlight</B>( <i>Float red, Float green, Float blue, Float intensity, Float life, [ String type1 ], [ String type2 ] </i>)</tt><BR>
|
||||
<ul>Spawn a dynamic light from the origin of the model<BR>
|
||||
The red,green,blue parms are the color of the light<BR>
|
||||
The intensity is the radius of the light<BR>
|
||||
type is the type of light to create (lensflare,viewlensflare,additive)</ul>
|
||||
|
||||
<P><tt><B>originemitter</B>( <i>String emitterName </i>)</tt><BR>
|
||||
<ul>Create an emitter that spawns tempmodels from the origin.<BR>
|
||||
This command is followed by a ( to specify a block of commands that modify the tempmodels</ul>
|
||||
|
||||
<P><tt><B>originspawn</B></tt><BR>
|
||||
<ul>Spawn tempmodels from the origin.<BR>
|
||||
This command is followed by a ( to specify a block of commands that modify the tempmodels</ul>
|
||||
|
||||
<P><tt><B>parallel</B></tt><BR>
|
||||
<ul>Set tempmodel to be parallel to the viewer</ul>
|
||||
|
||||
<P><tt><B>parentangles</B></tt><BR>
|
||||
<ul>Set the tempmodels angles to that of its parent</ul>
|
||||
|
||||
<P><tt><B>parentlink</B></tt><BR>
|
||||
<ul>Set the tempmodels linked to the parent, so they move with the parent model</ul>
|
||||
|
||||
<P><tt><B>physicsrate</B>( <i>String rate </i>)</tt><BR>
|
||||
<ul>Set the rate (in updates per second) for the tempmodel's physics to be updated</ul>
|
||||
|
||||
<P><tt><B>print</B>( <i>String string </i>)</tt><BR>
|
||||
<ul>Prints a string.</ul>
|
||||
|
||||
<P><tt><B>printdeathmsg</B>( <i>String msg1,, String msg2,, String killer,, String victim,, String deathType </i>)</tt><BR>
|
||||
<ul>Prints a death message string. Used to allow death messages to appear in their correct language on client machines.</ul>
|
||||
|
||||
<P><tt><B>radialvelocity</B>( <i>Float scale, Float min_additional, Float max_additional </i>)</tt><BR>
|
||||
<ul>Subtracts the particle origin from origin and multiplies by scale, then adds additional velocity<BR>
|
||||
between min and max... negative values bring toward origin<BR>
|
||||
</ul>
|
||||
|
||||
<P><tt><B>radius</B>( <i>Float radius </i>)</tt><BR>
|
||||
<ul>Set the radius of the sphere for the inwardsphere amd sphere settings</ul>
|
||||
|
||||
<P><tt><B>randomchance</B>( <i>Float percentage, [ String [arg1] ], [ String [arg2] ], [ String [arg3] ], [ String [arg4] ], [ String [arg5] ], [ String [arg6] ] </i>)</tt><BR>
|
||||
<ul>Set the percentage chance that command will occur</ul>
|
||||
|
||||
<P><tt><B>randomroll</B></tt><BR>
|
||||
<ul>Set the tempmodels so they pick a random roll value every frame</ul>
|
||||
|
||||
<P><tt><B>randvel</B>( <i>[ String [random|crandom|range] ], Float xVel, [ Float [xVel2] ], [ String [random|crandom|range] ], Float yVel, [ Float [yVel2] ], [ String [random|crandom|range] ], Float zVel, [ Float [zVel2] ] </i>)</tt><BR>
|
||||
<ul>Add a random component to the regular velocity.<BR>
|
||||
If random is specified, the component will range from 0 to specified velocity.<BR>
|
||||
If crandom is specified, the component will range from -specified to +specified velocity.<BR>
|
||||
If range is specified, the component needs two values; it will randomly pick a number in the range<BR>
|
||||
from the first number to the first number plus the second number.<BR>
|
||||
If no keyword is explicitly specified, then the component will just be added on<BR>
|
||||
without randomness.<BR>
|
||||
This velocity is applied using the world axis</ul>
|
||||
|
||||
<P><tt><B>randvelaxis</B>( <i>[ String [random|crandom|range] ], Float forwardVel, [ Float [forwardVel2] ], [ String [random|crandom|range] ], Float rightVel, [ Float [rightVel2] ], [ String [random|crandom|range] ], Float upVel, [ Float [upVel2] ] </i>)</tt><BR>
|
||||
<ul>Add a random component to the regular velocity.<BR>
|
||||
If random is specified, the component will range from 0 to specified velocity.<BR>
|
||||
If crandom is specified, the component will range from -specified to +specified velocity.<BR>
|
||||
If range is specified, the component needs two values; it will randomly pick a number in the range<BR>
|
||||
from the first number to the first number plus the second number.<BR>
|
||||
If no keyword is explicitly specified, then the component will just be added on<BR>
|
||||
without randomness.<BR>
|
||||
This velocity is applied using the parent axis</ul>
|
||||
|
||||
<P><tt><B>relativeangles</B>( <i> </i>)</tt><BR>
|
||||
<ul>makes the spawn angles get applied relative to the orientation of the model</ul>
|
||||
|
||||
<P><tt><B>scale</B>( <i>Float scale </i>)</tt><BR>
|
||||
<ul>Set the scale of a spawned tempmodel</ul>
|
||||
|
||||
<P><tt><B>scalemax</B>( <i>Float scalemax </i>)</tt><BR>
|
||||
<ul>Set the maximum scale of a spawned tempmodel</ul>
|
||||
|
||||
<P><tt><B>scalemin</B>( <i>Float scalemin </i>)</tt><BR>
|
||||
<ul>Set the minimum scale of a spawned tempmodel</ul>
|
||||
|
||||
<P><tt><B>scalerate</B>( <i>Float rate </i>)</tt><BR>
|
||||
<ul>Set the scaling rate of the spawned tempmodel<BR>
|
||||
If a negative rate is used, the model will shrink</ul>
|
||||
|
||||
<P><tt><B>scaleupdown</B></tt><BR>
|
||||
<ul>Set the tempmodel to scale up to scale value and then down.</ul>
|
||||
|
||||
<P><tt><B>settiki</B>( <i>String settiki </i>)</tt><BR>
|
||||
<ul>sets the tiki the aliases should be on in the sound uberfile</ul>
|
||||
|
||||
<P><tt><B>sfx</B>( <i>String sCommand, [ String arg1 ], [ String arg2 ], [ String arg3 ], [ String arg4 ], [ String arg5 ], [ String arg6 ], [ String arg7 ], [ String arg8 ] </i>)</tt><BR>
|
||||
<ul>Used for adding commands to a special effect</ul>
|
||||
|
||||
<P><tt><B>smokeparms</B>( <i>Float typeinfo, Float fademult, Float scalemult </i>)</tt><BR>
|
||||
<ul>Sets some misc parms for smoke</ul>
|
||||
|
||||
<P><tt><B>sound</B>( <i>String soundName, [ String channelName ], [ Float volume ], [ Float min_distance ], [ Float pitch ], [ Float randompitch ], [ String randomvolume ] </i>)</tt><BR>
|
||||
<ul>Play the specified sound</ul>
|
||||
|
||||
<P><tt><B>spawnrange</B>( <i>Integer range1, [ Integer range2 ] </i>)</tt><BR>
|
||||
<ul>Sets the range in which this effect will spawn tempmodels. If one number is specified, it is the max range<BR>
|
||||
and 0 is the min range; if two numbers are specified, the larger is the max range.<BR>
|
||||
</ul>
|
||||
|
||||
<P><tt><B>spawnrate</B>( <i>Float rate </i>)</tt><BR>
|
||||
<ul>Set the spawnrate of the emitter (models per second).<BR>
|
||||
This is only used for emitters and not for the originspawn and tagspawn commands</ul>
|
||||
|
||||
<P><tt><B>sphere</B></tt><BR>
|
||||
<ul>Set the tempmodels to spawn in a sphere around the origin.<BR>
|
||||
If sphereradius is set, the tempmodels will spawn at the radius distance from<BR>
|
||||
the origin</ul>
|
||||
|
||||
<P><tt><B>spin</B>( <i>Float rotations_per_second </i>)</tt><BR>
|
||||
<ul>Sets counterclockwise rotations per second at which the emitter's x/y-axes rotate around its z-axis</ul>
|
||||
|
||||
<P><tt><B>spread</B>( <i>Float spreadx, Float spready </i>)</tt><BR>
|
||||
<ul>Add a random variance in the spawned beam in the forward direction by the amound specified in spreadx and spready</ul>
|
||||
|
||||
<P><tt><B>spritegridlighting</B></tt><BR>
|
||||
<ul>Calculates grid lighting for a sprite</ul>
|
||||
|
||||
<P><tt><B>startoff</B></tt><BR>
|
||||
<ul>Signals an emitter to start in the off state (no tempmodels are emitted)</ul>
|
||||
|
||||
<P><tt><B>stopaliaschannel</B>( <i>String alias </i>)</tt><BR>
|
||||
<ul>Stops the sound channel used by the specified alias.</ul>
|
||||
|
||||
<P><tt><B>stoploopsound</B></tt><BR>
|
||||
<ul>Stop the looping sound</ul>
|
||||
|
||||
<P><tt><B>stopsound</B>( <i>String channelName </i>)</tt><BR>
|
||||
<ul>Stops the sound on the specified channel.</ul>
|
||||
|
||||
<P><tt><B>swarm</B>( <i>Integer frequency, Float maxspeed, Float delta </i>)</tt><BR>
|
||||
<ul>Create a swarm like effect that the tempmodels follow when they are spawned<BR>
|
||||
frequency is how often they change direction<BR>
|
||||
maxspeed is how fast the tempmodel will move (it's randomly generated every<BR>
|
||||
time the frequency is hit)<BR>
|
||||
delta is how much the tempmodel moves toward the origin every frame</ul>
|
||||
|
||||
<P><tt><B>swipe</B>( <i>[ Vector origin ] </i>)</tt><BR>
|
||||
<ul>Do a swipe and add it on to the swipe rendering list.</ul>
|
||||
|
||||
<P><tt><B>swipeoff</B></tt><BR>
|
||||
<ul>Signal the end of a swipe</ul>
|
||||
|
||||
<P><tt><B>swipeon</B>( <i>String shader, String startTagName, Float endTagNamelife, Float life </i>)</tt><BR>
|
||||
<ul>Signal the start of a swipe from the current tag</ul>
|
||||
|
||||
<P><tt><B>tagbeamemitter</B>( <i>String tagstart, String tagend, String name </i>)</tt><BR>
|
||||
<ul>Create a beam emitter that uses 2 tags to determine it's start and end position</ul>
|
||||
|
||||
<P><tt><B>tagbeamspawn</B>( <i>String tagstart, Float name </i>)</tt><BR>
|
||||
<ul>Create a beam emitter that uses the tag to determine it's starting position.</ul>
|
||||
|
||||
<P><tt><B>tagdlight</B>( <i>String tagName, Float red, Float green, Float blue, Float intensity, Float life, [ String intvel ], [ String type1 ] </i>)</tt><BR>
|
||||
<ul>Spawn a dynamic light from the specified tag<BR>
|
||||
The red,green,blue parms are the color of the light<BR>
|
||||
The intensity is the radius of the light<BR>
|
||||
type is the type of light to create (lensflare,viewlensflare,additive)</ul>
|
||||
|
||||
<P><tt><B>tagemitter</B>( <i>String tagName, String emitterName </i>)</tt><BR>
|
||||
<ul>Create an emitter that spawns tempmodels from the specified tag.<BR>
|
||||
This command is followed by a ( to specify a block of commands that modify the tempmodels</ul>
|
||||
|
||||
<P><tt><B>taglist</B>( <i>String arg1, String arg2, [ String arg3 ], [ String arg4 ], [ String arg5 ], [ String arg6 ], [ String arg7 ], [ String arg8 ] </i>)</tt><BR>
|
||||
<ul>Set the tag list to create a beam that travels between all the tags</ul>
|
||||
|
||||
<P><tt><B>tagspawn</B>( <i>String tagName </i>)</tt><BR>
|
||||
<ul>Spawn tempmodels from the specified tag.<BR>
|
||||
This command is followed by a ( to specify a block of commands that modify the tempmodels</ul>
|
||||
|
||||
<P><tt><B>tagspawnlinked</B>( <i>String tagName </i>)</tt><BR>
|
||||
<ul>Spawn tempmodels from the specified tag, linked to the entity at the tag.<BR>
|
||||
This command is followed by a ( to specify a block of commands that modify the tempmodels</ul>
|
||||
|
||||
<P><tt><B>tracelength</B>( <i>Float length </i>)</tt><BR>
|
||||
<ul>Set the length of the trace for the decal</ul>
|
||||
|
||||
<P><tt><B>trail</B>( <i>String shader, String startTag, String endTag, Float life </i>)</tt><BR>
|
||||
<ul>Set the tempmodel to have a swipe that follows it</ul>
|
||||
|
||||
<P><tt><B>treads</B>( <i>String tagName, String shader, Integer localrefnumber </i>)</tt><BR>
|
||||
<ul>Spawn treads from the specified tag using the specified tread type.</ul>
|
||||
|
||||
<P><tt><B>treadsoff</B>( <i>String tagName, Integer localrefnumber </i>)</tt><BR>
|
||||
<ul>Stops spawning treads from the specified tag.</ul>
|
||||
|
||||
<P><tt><B>twinkle</B>( <i>Float mintimeoff, Float maxtimeoff, Float mintimeon, Float maxtimeon </i>)</tt><BR>
|
||||
<ul>Set the tempmodel to twinkle with the specified settings</ul>
|
||||
|
||||
<P><tt><B>uselasttraceend</B></tt><BR>
|
||||
<ul>Makes this trace command use the end results of the last trace command</ul>
|
||||
|
||||
<P><tt><B>varycolor</B></tt><BR>
|
||||
<ul>Sets the color to vary by 0 to -200f specified color</ul>
|
||||
|
||||
<P><tt><B>velocity</B>( <i>Float forwardVelocity </i>)</tt><BR>
|
||||
<ul>Set the forward velocity of the spawned tempmodel</ul>
|
||||
|
||||
<P><tt><B>viewkick</B>( <i>Float pitchmin, Float pitchmax, Float yawmin, Float yawmax, Float recenterspeed, String patters, Float pitchmax, Float yawmax </i>)</tt><BR>
|
||||
<ul>Adds kick to the view of the owner when fired.</ul>
|
||||
|
||||
<P><tt><B>volumetric</B></tt><BR>
|
||||
<ul>Set the effect to spawn volumetric sources rather than tempmodels</ul>
|
||||
|
||||
<P><tt><B>wateronly</B></tt><BR>
|
||||
<ul>makes the temp model remove itself if it leaves water</ul>
|
||||
|
||||
<P><tt><B>wind</B></tt><BR>
|
||||
<ul>Makes the temp model be affected by wind</ul>
|
||||
</BLOCKQUOTE>
|
||||
|
||||
<h2> <a name="ClientSpecialEffectsManager">ClientSpecialEffectsManager</a> -> <a href="#Listener">Listener</a> -> <a href="#Class">Class</a></h2>
|
||||
<BLOCKQUOTE>
|
||||
|
||||
<P><tt><B>effectdelay</B>( <i>Integer iEffect, Integer iCurrEmitter, Vector vPos, Vector vAngles, Vector vAxisA, Vector vAxisB, Vector vAxisC </i>)</tt><BR>
|
||||
<ul>Resumes the execution of iEffect effect from its iCurrEmitter emitter.</ul>
|
||||
</BLOCKQUOTE>
|
||||
|
||||
<h2> <a name="Event">Event</a> -> <a href="#Class">Class</a></h2>
|
||||
<BLOCKQUOTE>
|
||||
</BLOCKQUOTE>
|
||||
|
||||
<h2> <a name="Listener">Listener</a> -> <a href="#Class">Class</a></h2>
|
||||
<BLOCKQUOTE>
|
||||
|
||||
<P><tt><B>commanddelay</B>( <i>Float delay, String command, [ String [arg1] ], [ String [arg2] ], [ String [arg3] ], [ String [arg4] ], [ String [arg5] ], [ String [arg6] ] </i>)</tt><BR>
|
||||
<ul>executes a command after the given delay</ul>
|
||||
|
||||
<P><tt><B>delete</B></tt><BR>
|
||||
<ul>Removes this listener immediately.</ul>
|
||||
|
||||
<P><tt><B>immediateremove</B></tt><BR>
|
||||
<ul>Removes this listener immediately.</ul>
|
||||
|
||||
<P><tt><B>remove</B></tt><BR>
|
||||
<ul>Removes this listener the next time events are processed.</ul>
|
||||
</BLOCKQUOTE>
|
||||
|
||||
<h2> <a name="Script">Script</a> -> <a href="#Class">Class</a></h2>
|
||||
<BLOCKQUOTE>
|
||||
</BLOCKQUOTE>
|
||||
|
||||
<h2> <a name="VoteOptions">VoteOptions</a> -> <a href="#Class">Class</a></h2>
|
||||
<BLOCKQUOTE>
|
||||
</BLOCKQUOTE>
|
||||
<H2>
|
||||
7 Client Game Module Classes.<BR>141 Client Game Module Events.
|
||||
</H2>
|
||||
</BODY>
|
||||
</HTML>
|
392
docs/MOH_Client_Side_Reference.html
Normal file
|
@ -0,0 +1,392 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>MOHAA - SDK</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<b><u><font size=+2>MOH Client Commands Reference Guide</font></u></b>
|
||||
<br>
|
||||
<p>
|
||||
Last Updated: December 17, 2002
|
||||
</p>
|
||||
|
||||
<b>Overview</b>
|
||||
<br>
|
||||
<p>
|
||||
Client side commands refer to any commands that are used in the client game DLL (cgame DLL). These commands are placed and executed on frames of animation. When a TIKI model’s animation is played back on the client, the commands associated with those frames are executed. This document also contains a list of client INIT commands. These are commands that are only executed on the client when the model is initialized. These commands deal with setting up emitters.
|
||||
</p>
|
||||
|
||||
<b>Example</b>
|
||||
<br>
|
||||
<p>
|
||||
This is a list of client commands and parameters for the client. These commands can be placed in a TIKI file for execution. Here is an example to get started:
|
||||
</p>
|
||||
<pre>
|
||||
<i><font color=blue>
|
||||
Animations
|
||||
{
|
||||
power power.skc
|
||||
{
|
||||
client
|
||||
{
|
||||
first tagspawn tag_hand
|
||||
(
|
||||
count 50
|
||||
model models/flameball.tik
|
||||
velocity 50
|
||||
randvel 0 0 200
|
||||
avelocity random 360 random 360 random 360
|
||||
life 1
|
||||
accel 0 0 -100
|
||||
scale 0.1
|
||||
fade
|
||||
bouncefactor 0.8
|
||||
offset crandom 3 crandom 3 crandom 3
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
</font>
|
||||
</i>
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
Here is an explantion of what is going to happen when the first frame of the “power” animation is executed.
|
||||
<br>
|
||||
<br>
|
||||
After the definition of the animation <b>“power power.skc”</b> You can list client and server side commands that will be executed on the specified frames. In this case there is a client command on the first frame of the power animation. Notice that the command is called <b>“tagspawn”</b> and it has one parameter on the same line called <b>“hand”</b>. This command allows you to spawn things ( particles, models, sprites ) from the tag that is built into the model ( in this case it’s the hand tag ).
|
||||
<br>
|
||||
<br>
|
||||
The “(“ on the next line starts a block of modifiers and parameters that will affect the spawning properties of the command. There are 11 lines of parameters after the “(“ and then there is a closing “)”. The “)” signifies the end of the parameters/modifiers and finishes off the command. Each one of the modifiers is explained below, along with the commands like <b>“tagspawn”</b>.
|
||||
</p>
|
||||
|
||||
<b>Client Animation Commands</b>
|
||||
<br>
|
||||
<p>
|
||||
These commands can be executed on any frame of any animation on the client. These are placed in the client frame commands of the TIKI file
|
||||
</p>
|
||||
|
||||
|
||||
<table border=1 cellpadding=2 cellspacing=3>
|
||||
<tr>
|
||||
<td><b>alias <path> <alias> </b>
|
||||
<td>Creates an alias to to the specified path
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>aliascache <aliasname> <resourcename></b>
|
||||
<td>Caches in the specified resource name and creates the alias specified to reference it.
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>cache <resourcename> </b>
|
||||
<td>Caches in the specified resource name
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>commanddelay <time> <commandnum> <command> [arg1]…[argN] </b>
|
||||
<td>Delays the <command> by the <time> specified. There wll be a delay between the execution of the command. The <commandnum> must be provided by the user, It is used to keep track of the different commands and the times they are executed.
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>dlight <red> <green> <blue> <intensity> <life> <type> </b>
|
||||
<td>Spawn a dlight from the origin of the model. The <type> of the light can be normal, lensflare, or viewlensflare
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>emitteroff <emittername> </b>
|
||||
<td>Turns “off” the specified emitter
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>emitteron <emittername> </b>
|
||||
<td>Turns “on” the specified emitter
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>entcolor </b>
|
||||
<td>Set the color(modulate) of the model.
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>loopsound <soundfile> [volume] [mindistance] </b>
|
||||
<td>Plays the specified sound in a loop
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>originspawn([parameter list]…) </b>
|
||||
<td>Spawn “things” from the origin of the model. The parameter list after the command specify modifiers on the command.
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>randomchance <amount> <command> [arg1]…[argN] </b>
|
||||
<td>This will randomly execute the specified command. The amount ranges from 0 to 1 and is the percentage chance that the command will execute.
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>sound <soundfile> [channel number] [volume] [mindistance] </b>
|
||||
<td>Plays the specified sound. Channel, volume, and mindistance are optional
|
||||
<tr>
|
||||
<tr>
|
||||
<td><b>swipe </b>
|
||||
<td>Add a segment to the swipe.
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>swipeoff</b>
|
||||
<td>Signal the end of a swipe
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>swipeon <tagname> <size> <life> </b>
|
||||
<td>Signal the start of a swipe.
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>tagdlight <tagname> <red> <green> <blue> <intensity> <life> <type> </b>
|
||||
<td>Spawn a dlight from the specified tag of the model. The <type> of the light can be normal, lensflare, or viewlensflare
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>tagspawn <tagname>([parameter list]…) </b>
|
||||
<td>Spawn “things” from the tag specified on the model. The parameter list after the command specify modifiers on the command.
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>tagbeamspawn <tagname_start> <length> </b>
|
||||
<td>Spawns a beam from <tagname_start> of the specified <length>. The direction is derived from the tag.
|
||||
</tr>
|
||||
</table>
|
||||
<br>
|
||||
|
||||
<b>Client Initialization Commands</b>
|
||||
<br>
|
||||
<p>
|
||||
These commands set up client side effects that are not associated with animations These are placed in the client init section of the TIKI file.
|
||||
</p>
|
||||
|
||||
|
||||
<table border=1 cellpadding=2 cellspacing=3>
|
||||
<tr>
|
||||
<td><b>tagemitter <tagname> <emittername>(<parameter list>…) </b>
|
||||
<td>Creates a tag emitter named <emittername> that spawns out models from <tagname>. This is not associated with animation frames, so it can be used for static things that emit models without animating.
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>tagbeamemitter <tagname_start> <tagname_end> <emittername>{<parameter list>} </b>
|
||||
<td>Creates a beam emitter named <emittername> that spawns beams from tagname_start to tagname_end. This is not associated with animation frames, so it can be used for static things that have beam effects on them
|
||||
</tr>
|
||||
</table>
|
||||
<br>
|
||||
|
||||
<b>Parameters for Spawning stuff</b>
|
||||
<br>
|
||||
<p>
|
||||
These are used in the above commands to modify the “things”( tempmodels ) that are spawned from the emitters/spawn points.
|
||||
</p>
|
||||
|
||||
<table border=1 cellpadding=2 cellspacing=3>
|
||||
<tr>
|
||||
<td><b>accel <accelx> <accely> <accelz> </b>
|
||||
<td>Sets the acceleration for the tempmodel. You can simulate gravity by setting the accelz component to a negative value (E.g. accel 0 0 –200)
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>align </b>
|
||||
<td>Aligns the tempmodel in the direction it is traveling
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>alpha <alpha_value> </b>
|
||||
<td>Sets the alpha value of the tempmodel
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>angles (crandom|random) <yaw> (crandom|random) <pitch> (crandom|random) <roll> </b>
|
||||
<td>Sets the angular velocity of the tempmodel. Use the keywords random or crandom as stated in the randvel command.
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>anim <anim_name> </b>
|
||||
<td>Set the anim of the spawned tempmodel.
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>animateonce </b>
|
||||
<td>Animate the tempmodel once before killing it
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>avelocity (crandom|random) <yaw> (crandom|random) <pitch> (crandom|random) <roll> </b>
|
||||
<td>Sets the angular velocity of the tempmodel. Use the keywords random or crandom as stated in the randvel command.
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>bouncefactor <bounce_value> </b>
|
||||
<td>Sets the bounciness of the tempmodel. Values greater than 1 will make the model gain speed when it bounces.
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>circle</b>
|
||||
<td>Spawns the tempmodels in a circlular pattern on the XY plane
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>collision [‘water’] </b>
|
||||
<td>Turns on collision for the tempmodels (saves CPU if you don’t need collision ). Add the water keyword if you want the particles to collide with water.
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>color <red> <green> <blue> <alpha> </b>
|
||||
<td>Sets the color of the tempmodel. This color is modulated with the tempmodel when it is drawn.
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>colorrange <startRed> <startGreen> <startBlue> <endRed> <endGreen> <endBlue> </b>
|
||||
<td>Set the color range to be interpolated over the life of the tempmodel
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>count <number> </b>
|
||||
<td>The number of tempmodels to be spawned.
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>dietouch </b>
|
||||
<td>Kills the tempmodel when it touches a solid surface.
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>dlight <r> <g> <b> <intensity> </b>
|
||||
<td>Makes the emitter a dynamic light source of color (r,g,b) and the specified intensity ( radius ).
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>fade</b>
|
||||
<td>Fades the tempmodel to complete translucency over the life.
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>fadein <time> </b>
|
||||
<td>Fades the tempmodel in over the amount of time specified.
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>flicker</b>
|
||||
<td>Causes the tempmodel to flicker randomly
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>globalfade <”in” | “out> </b>
|
||||
<td>Makes the spawned tempmodels fade in or out at the same rate based on the number of frames in the animation of the parent animation.
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>inwardsphere <radius> </b>
|
||||
<td>Spawns the tempmodel at radius distance from the origin and moves them inward towards it.
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>life <seconds> </b>
|
||||
<td>The life of the spawned tempmodel.
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>model <modelname1> [modelname2] [modelname3] … </b>
|
||||
<td>The name of the model you want to spawn. If more than one model is specified then the model is chosen randomly from the list
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>offset (crandom|random) <offsetx> (crandom|random) <offsety> (crandom|random) <offsetz> </b>
|
||||
<td>Sets an offset of the tempmodel. Use the keywords random or crandom as stated in the randvel command.
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>offsetalongaxis (crandom|random) <offsetx> (crandom|random) <offsety> (crandom|random) <offsetz> </b>
|
||||
<td>Sets an offset of the tempmodel. Use the keywords random or crandom as stated in the randvel command. The offset is applied in the coordinate system of the parent
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>parentlink </b>
|
||||
<td>Links the spawned tempmodel to the parent. If the parent moves, so does the spawned tempmodel.
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>randvel (crandom|random) <speedx> (crandom|random) <speedy> (crandom|random) <speedz> </b>
|
||||
<td>Adds a random velocity to the tempmodel in the x, y, and z axis. Use the keyword random to make the value between 0 and speed. Use the keyword crandom to make the value between –speed and speed. If you don’t use the random or crandom keywords, then the added velocity will be constant.
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>scale <scale_value> </b>
|
||||
<td>Sets the scale of the tempmodel to value.
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>scalemax <scale_value> </b>
|
||||
<td>Sets the maximum scale of the tempmodel to value.
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>scalemin <scale_value> </b>
|
||||
<td>Sets the minimum scale of the temp model to value. By setting this, the spawned model will be randomly scaled to a value between scalemin and scalemax.
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>scalerate <scale_value> </b>
|
||||
<td>Animates the tempmodel by scaling it in size according to the specified scalerate value.
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>spawnrate <rate_value> </b>
|
||||
<td>Sets the rate of spawning for an emitter. This parameter is only valid for emitters that have been defined for the model.
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>sphere </b>
|
||||
<td>Spawns the tempmodels traveling in in an outward sphere pattern from the origin.
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>startoff </b>
|
||||
<td>Starts an emitter in the “off” state.
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>swarm <freq> <maxspeed> <delta> </b>
|
||||
<td>Causes a swarming effect on the tempmodels. freq is the frequency at which the tempmodel changes direction. maxspeed is the maximum speed of the tempmodel. delta is the amount the tempmodel moves toward the origin to get the swarming effect.
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>texanimtime <time> </b>
|
||||
<td>If you are spawning animated texture sprites, this sets the animation time for that sprite.
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>trailcolor <red> <green> <blue> <alpha> </b>
|
||||
<td>Sets the color of the trail for the tempmodel.
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>trailradius <radius> </b>
|
||||
<td>Sets the width of the trail
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>trailtime <seconds> </b>
|
||||
<td>Sets the life of the trail in seconds
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>velocity <speed> </b>
|
||||
<td>The speed of the tempmodel. It will travel in the direction based on the orientation of the parent.
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>wavy <amount> </b>
|
||||
<td>Causes the tempmodel to move in a wavy effect. amount sets the amount of the wavieness.
|
||||
</tr>
|
||||
</table>
|
||||
<br>
|
||||
|
||||
<b>Beam Specific Parameters</b>
|
||||
<br>
|
||||
<p>
|
||||
These parameters are only applicable to beamemitters and tagbeamspawn
|
||||
</p>
|
||||
|
||||
<table border=1 cellpadding=2 cellspacing=3>
|
||||
<tr>
|
||||
<td><b>numsegments <num> </b>
|
||||
<td>Set the number of segments in the beam
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>minoffset <offset> </b>
|
||||
<td>Set the minimum offset from center that the beam will move
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>maxoffset <offset> </b>
|
||||
<td>Set the maximum offset from center that the beam will move
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>beamshader <shader_name> </b>
|
||||
<td>Set the shader that the beam will use
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>beamdelay <delay> </b>
|
||||
<td>Set the delay (in seconds) between the drawing of beams
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>beamtoggledelay [random] <delay> </b>
|
||||
<td>Set the delay (in seconds) that is used to toggle the beams off and on. If random is used, then the delay will be between 0 and delay.
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>beampersist </b>
|
||||
<td>Effect that makes the beams persist and fade out over time
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>beamsphere <count> </b>
|
||||
<td>Shoot the beams out in a sphere pattern. If the radius (see above) is set, beams will be drawn at this distance from center
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
|
||||
</body>
|
||||
|
||||
|
||||
<p>
|
||||
|
||||
</p>
|
||||
|
||||
|
||||
|
||||
<pre>
|
||||
<i><font color=blue>
|
||||
|
||||
</font>
|
||||
</i>
|
||||
</pre>
|
BIN
docs/MOH_GUI_Documentation/1-1.jpg
Normal file
After Width: | Height: | Size: 30 KiB |
BIN
docs/MOH_GUI_Documentation/1-2.jpg
Normal file
After Width: | Height: | Size: 42 KiB |
7150
docs/MOH_GameClasses.html
Normal file
BIN
docs/MOH_Terrain_Editing_Manual/1-1.jpg
Normal file
After Width: | Height: | Size: 44 KiB |
BIN
docs/MOH_Terrain_Editing_Manual/1-2.jpg
Normal file
After Width: | Height: | Size: 52 KiB |
BIN
docs/MOH_Terrain_Editing_Manual/1-3.jpg
Normal file
After Width: | Height: | Size: 64 KiB |
BIN
docs/MOH_Terrain_Editing_Manual/1-4.jpg
Normal file
After Width: | Height: | Size: 3.1 KiB |
BIN
docs/MOH_Terrain_Editing_Manual/1-5.jpg
Normal file
After Width: | Height: | Size: 72 KiB |
BIN
docs/MOH_Terrain_Editing_Manual/1-6.jpg
Normal file
After Width: | Height: | Size: 106 KiB |
BIN
docs/MOH_Terrain_Editing_Manual/1-7.jpg
Normal file
After Width: | Height: | Size: 59 KiB |
BIN
docs/MOH_Terrain_Editing_Manual/1-8.jpg
Normal file
After Width: | Height: | Size: 3.5 KiB |
308
docs/MOH_design_faq.html
Normal file
|
@ -0,0 +1,308 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>MOHAA - SDK</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<b><u><font size=+2><center>MOH Design FAQ</center></font></u></b>
|
||||
<br>
|
||||
<br>
|
||||
|
||||
<b>Global</b>
|
||||
<br>
|
||||
<br>
|
||||
|
||||
<p>
|
||||
<b>Q:</b>How do the scripts tie into the levels?
|
||||
<br><br>
|
||||
<b>A:</b>The game automatically loads the script file that has the same name as the level. Loading m5l1a.bsp will load m5l1a.scr. Scripts can also load global scripts by exec'ing them (like exec global/weather.scr), which adds additional functionality that you wouldn't want to write into the level scripts. Most levels will load auto.scr at the beginning. Auto.scr automatically loads various scripts (which scripts are loaded can be seen by opening up auto.scr in notepad).
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<b>Q:</b>How do you implement weather? (Rain, Snow…)
|
||||
<br><br>
|
||||
<b>A:</b>You need to create rain volumes (create a box inside of which you want the rain to fall, make it func_rain and give it the common/rain texture). <br>
|
||||
<br>
|
||||
For rain, do:
|
||||
<pre><i><font color=blue>exec global/weather.scr </font></i></pre>
|
||||
at the beginning of the level's script.
|
||||
<br><br>
|
||||
For snow, try this example thread from the snowy forest (mohdm5) that adds snow:
|
||||
<pre><i><font color=blue>snow:
|
||||
wait 1
|
||||
level.rain_speed = "32"
|
||||
level.rain_speed_vary = "16"
|
||||
level.rain_length = "2"
|
||||
level.rain_width = "1"
|
||||
level.rain_density = ".2"
|
||||
level.rain_slant = "250"
|
||||
level.rain_min_dist = "1800"
|
||||
file://level.rain_min_dist = "512"
|
||||
level.rain_numshaders = 12
|
||||
level.rain_shader = "textures/snow0"
|
||||
end
|
||||
</font></i></pre>
|
||||
</p>
|
||||
<br>
|
||||
|
||||
<p>
|
||||
<b>Q:</b>How is dialog triggered? If I want someone to say something to the player at a certain point, how do I set it up?
|
||||
<br><br>
|
||||
<b>A:</b>You can place trigger volumes in a level that the player walks through to set off (trigger_once with the key "setthread" and value of whatever thread in the script you want it to run). In the thread you could have any AI you wanted say a line. You could also have them turnto or lookat the $player first.
|
||||
<br><br>
|
||||
Most talking is done by waiting until the player is close to the friendly (for example doing a while loop seeing if the vector_length $player.origin - ai.origin) < 300), and then telling the ai to lookat the player, then doing a say command, and then a waittill saydone on the AI before it continues to do anything else.
|
||||
</p>
|
||||
<br>
|
||||
|
||||
<p>
|
||||
<b>Q:</b>What's our max poly count? On screen? In a level?
|
||||
<br><br>
|
||||
<b>A:</b>Our plan for MOHAA: Spearhead was to stay between 12k and 16k total polygons in any given scene (at maximum LOD settings). The visible brush count in a level ranged from 6500 to 8000 or so. The maximum level total was determined by the maximum size of the bsp file, which we had at 10MB.
|
||||
</p>
|
||||
<br>
|
||||
|
||||
<p>
|
||||
<b>Q:</b>How does the AI on your team work?
|
||||
<br><br>
|
||||
<b>A:</b>Open friendly.scr. There is a long section at the top of that script describing how to use it. There is also useful information at the top of AI.scr.
|
||||
</p>
|
||||
<br>
|
||||
|
||||
<p>
|
||||
<b>Q:</b>For example, what in the script makes a group of guys follow you through a level? And how do they decide where to go? It seems that they have a separate path that they must stay near as they navigate through a given level, is this correct?
|
||||
<br><br>
|
||||
<b>A:</b>Yes. In MOHAA: Spearhead they follow paths (a series of linked info_pathnodes) that begin with a pathnode that has the targetname "friendlychain". This is clear on t1l3 and t2l1. You can turn these paths on and off in script whenever you like, to make friendlies stop progressing (evident in t1l3 and t2l1, again). Or, you can just set friendlies to friendtype 1 and they will follow the player where ever he goes.
|
||||
</p>
|
||||
<br>
|
||||
|
||||
<p>
|
||||
<b>Q:</b>How do the exec global/friendly.scr::friendlythink and exec global/enable_ai.scr script commands affect the AI?
|
||||
<br><br>
|
||||
<b>A:</b>Friendlythink turns on the friendly's "friendly AI" that makes them follow the player in some way. You never want to do this more than once on a friendly. global/enable_ai.scr and global/disable_ai.scr enable and disable any AI's combat AI. If you disable it, they will not pay any attention to enemies. Use this with caution.
|
||||
</p>
|
||||
<br>
|
||||
|
||||
<p>
|
||||
<b>Q:</b>How do I get friendly AI to branch away from the player and do his own thing? For example, you fight alongside the Captain for a while, then he gives you an order and goes off on his own. You meet up with him later, etc.
|
||||
<br><br>
|
||||
<b>A:</b>You would disable his friendly AI by setting his friendtype to -1 and then either wait for him to get out of combat (do a while (self.thinkstate != "idle") or while (self.thinkstate == "attack")), and then tell him to do explicit things like talk to the player or run somewhere, and he will do it.
|
||||
</p>
|
||||
<br>
|
||||
|
||||
<p>
|
||||
<b>Q:</b>What are AI leashes used for?
|
||||
<br><br>
|
||||
<b>A:</b>They set the distance the AI is willing to move from wherever they are when combat begins. All AI wants to stay within the bounds of their leash.
|
||||
</p>
|
||||
<br>
|
||||
|
||||
<p>
|
||||
<b>Q:</b>AI seems to be spawned immediately when a level loads. Is there a way to spawn guys when a trigger is fired instead? For example, what if I want a group of guys to be spawned upstairs and then run down the stairs, but not until the player walks in a certain doorway?
|
||||
<br><br>
|
||||
<b>A:</b>Yes. Create a trigger volume "enemyspawnertrigger" and link (select the trigger, THEN the AI and hit ctrl-K) it to AI (any number of AI. You may have to manually assign them targetnames to actually give them all the same targetname). The AI themselves can be linked to individual nodes (select the AI, THEN the node and hit ctrl-K). When the player hits the trigger, the AI will spawn and they will run to those nodes and then fight the player.
|
||||
</p>
|
||||
<br>
|
||||
|
||||
<p>
|
||||
<b>Q:</b>Is there a set on-screen character limit?
|
||||
<br><br>
|
||||
<b>A:</b>No. The more you add, the slower the game gets. What do you think this is? A stinkin’ console game??
|
||||
</p>
|
||||
<br>
|
||||
|
||||
<p>
|
||||
<b>Q:</b>How do you set up some Nazis firing an MG42?
|
||||
<br><br>
|
||||
<b>A:</b>The simplest way is to do it like the mg42 gunner in t1l2. Place an mg42, give it $targetname "mg42", and target it to an AI. The AI will use the gun. If you want a new AI to spawn and run to the gun when the gunner is killed, then target the gunner to another AI. That AI will be the spawn point for the new gunner when the current gunner dies. <br>
|
||||
<br>
|
||||
This functionality uses turret.scr so you would have to "exec global/turret.scr" at the beginning of your script (or "exec global/auto.scr").
|
||||
</p>
|
||||
<br>
|
||||
|
||||
<p>
|
||||
<b>Q:</b>How do I get the stopwatch to pop up in my mission?
|
||||
<br><br>
|
||||
<b>A:</b>The script line is “$player stopwatch x” (x=# of seconds)
|
||||
</p>
|
||||
<br>
|
||||
|
||||
<p>
|
||||
<b>Q:</b>What about look at triggers?
|
||||
<br><br>
|
||||
<b>A:</b>The line of script is “if ($player cansee self x)” where x=the FOV. See training.scr for details.
|
||||
</p>
|
||||
<br>
|
||||
|
||||
<br>
|
||||
<b>Editor</b>
|
||||
<br>
|
||||
<br>
|
||||
|
||||
<p>
|
||||
<b>Q:</b>I need to minimize my editor every time I run the game. How do I get around this?
|
||||
<br><br>
|
||||
<b>A:</b>Enter in “r_fullscreen 0” at the console and restart the game. If you end up with the game in a small window, change your resolution in the game to match the resolution of your desktop. If you don’t know what this means, get a job washing cars.
|
||||
</p>
|
||||
<br>
|
||||
|
||||
<p>
|
||||
<b>Q:</b>The entity window pops up every time I run the game. That sure is annoying. What should I do?
|
||||
<br><br>
|
||||
<b>A:</b>If you run the game in a window (see above), this will no longer happen.
|
||||
</p>
|
||||
<br>
|
||||
|
||||
<p>
|
||||
<b>Q:</b>Any lighting tips? Is there a quicker way to see the results of lighting changes you make?
|
||||
<br><br>
|
||||
<b>A:</b>You can compile maps using -fast in mohlight to give you a rough approximation of the end result. Light is pretty slow, although surface lights and radiosity are especially slow. Use "-bounce 0" to get rid of radiosity.
|
||||
</p>
|
||||
<br>
|
||||
|
||||
<p>
|
||||
<b>Q:</b>Is the caulk texture all you need to use to make sure a poly/brush won't draw? We've heard of a caulk shader as well, or is it the same thing?
|
||||
<br><br>
|
||||
<b>A:</b>Everything is a shader. Use "common/caulk" to make a surface not draw.
|
||||
</p>
|
||||
<br>
|
||||
|
||||
<p>
|
||||
<b>Q:</b>Explain the difference between the AI window (push I) and the Entity window (push N) when dealing with AI. Why would you have to call the AI parameters window up vs. doing these things in the entity window?
|
||||
<br><br>
|
||||
<b>A:</b>The AI parameter window is like a shortcut. When you first create an AI, his parameters aren't available in the entity window. You have to call up the AI window to add them (otherwise they're just defaults).
|
||||
</p>
|
||||
<br>
|
||||
|
||||
<p>
|
||||
<b>Q:</b>Efficient terrain building tips? Should we use patches liberally?
|
||||
<br><br>
|
||||
<b>A:</b>You're better off sticking with terrain. Patches where AI or the player will actually walk need to have invisible brush collision created for them because curves don't approximate good collision. <br>
|
||||
<br>
|
||||
For terrain, keep any terrain that touches level geometry at low or medium tolerance (of LOD), but terrain that is not connected to curves or brushes can be fairly low LOD (high tolerance). Be sure to flag terrain that will never be seen as "delete" (ctrl-shift-LMB to select, then shift-F, check “delete”).
|
||||
</p>
|
||||
<br>
|
||||
|
||||
<p>
|
||||
<b>Q:</b>We are experiencing bsp leaks from doors, lights and the like. Any tips on avoiding/eradicating these?
|
||||
<br><br>
|
||||
<b>A:</b>In the level editor go to "file" and click "pointfile". If you are compiling in the same directory you are loading maps from, then you will see a red line in the level going from outside the level, through the leak, to inside.
|
||||
</p>
|
||||
<br>
|
||||
|
||||
<p>
|
||||
<b>Q:</b>How do I create collapsing or exploding geometry?
|
||||
<br><br>
|
||||
<b>A:</b>1) Create the pre-destruction geometry, make it a script object in the entity window. Give it and all of the following relating pieces a #set number so you can have multiple instances of collapsing geometry in a given level. <br>
|
||||
<br>
|
||||
2) Give the geometry the $targetname exploder. <br>
|
||||
<br>
|
||||
3) Make the destroyed version of the geometry, make it a script object in the entity window. <br>
|
||||
<br>
|
||||
4) Give the destroyed geometry the $targetname explodersmashed. <br>
|
||||
<br>
|
||||
5) Create a trigger_multiple with the $targetname explodertrigger. Check the damage box in the entity window. This trigger should encompass however much of the geometry you want to react to bullets. If you want a wall to collapse when it is shot, surround the whole wall with this trigger. <br>
|
||||
<br>
|
||||
6) For debris that flies away from the geometry when it explodes, create another script object with the $targetname exploderchunk. Place a script origin and target it (ctrl-k) at the chunk. The chunk will fly towards the origin when the explosion occurs. <br>
|
||||
<br>
|
||||
7) For explosion effects, place a script model and give it a $targetname of exploderfire. <br>
|
||||
<br>
|
||||
8) For collapsing geometry, you can place add some variables to an exploderchunk - #xrot xx/#yrot xx/#zrot xx . This will make the geometry will rotate along the specified axis as it moves towards it’s assigned script origin. <br>
|
||||
</p>
|
||||
<br>
|
||||
|
||||
<br>
|
||||
<b>Regarding path nodes:</b>
|
||||
<br>
|
||||
<br>
|
||||
|
||||
<p>
|
||||
<b>Q:</b>What attributes can be assigned to them?
|
||||
<br><br>
|
||||
<b>A:</b>$Targetname if you want to reference them specifically in script. In some cases angle is relevant too. There is an AI document in the docs (AI tips.doc) that has a lot of specific stuff about path nodes and how AI relates to them.
|
||||
</p>
|
||||
<br>
|
||||
|
||||
<p>
|
||||
<b>Q:</b>Why don't you have to change their direction in the entity window (they seem to work fine pointing in any direction)
|
||||
<br><br>
|
||||
<b>A:</b>They indicate where AI can go, they don't tell AI which way to point when they're going there (except in special circumstances like with cover nodes and corner nodes).
|
||||
</p>
|
||||
<br>
|
||||
|
||||
<p>
|
||||
<b>Q:</b>How far apart should they be?
|
||||
<br><br>
|
||||
<b>A:</b>No more than 320 units max.
|
||||
</p>
|
||||
<br>
|
||||
|
||||
<br>
|
||||
<b>Random Editor tips</b>
|
||||
<br>
|
||||
<br>
|
||||
<p>
|
||||
- Ctrl-Alt-E Shows everything in the world an entity is linked to. <br><br>
|
||||
- Ctrl-Alt-MMB when pointing at the floor and having an entity selected will place that entity at ground level. Real useful when placing AI guys & pathnodes. <br><br>
|
||||
- Ctrl-Alt-Shift-Click duplicates and links. Very useful when building a path network. <br><br>
|
||||
- Ctrl-D hides all detail brushes, very useful. <br><br>
|
||||
- Don’t use the “sniper” checkbox on pathnodes. It’s broken. <br><br>
|
||||
- When setting up an alarm guy, set his alarm node (in the AI parameters window) to the same name as his target node. See m4l3 for reference. <br><br>
|
||||
- If you put $ in front of a string or # in front of a number in the entity window, you can reference them in script. Examples would be $targetname or #set. <br><br>
|
||||
- Setting an AI to #playerseek 0 in script will cause him not to seek out the player (he’ll act like a guard). <br><br>
|
||||
- level.totalbaddies is used as a checker for how many AI are alive in your level. So you could say if level.totalbaddies < 3 then send reinforcements, etc. <br><br>
|
||||
- You can check if the player is inside of a trigger area by using istouching in script. If istouching $targetboxname etc… <br><br>
|
||||
- You can change a guy to ai_actor in the entity window if you would like to change the color of his box in the editor. This is useful for distinguishing between spawned vs. placed AI, for example. Or you could make the main level boss one color and his helpers the default, etc. <br><br>
|
||||
- #fnum – set this number in an AI’s entity window if you want adjust his specific behavior. IE, you have a squad of guys with your, one of which you want to be a medic. If you give him an #fnum, you can call out his friend number in script and make him a medic. <br><br>
|
||||
- Crates and walls that you want AI to crouch behind and fire over should be around 48 units tall. Place nodes pointing TOWARDS the wall right next to the wall, and in the entity window check the CRATE checkbox. <br><br>
|
||||
- If you want to trigger something only once, place a trigger_multiple down and change it to trigger_once in the entity window. Simply placing a trigger_once may cause problems. <br><br>
|
||||
- println is the script command for printing debug messages on the screen. <br><br>
|
||||
- Indoor and Outdoor ambient sounds are placed by putting triggers in doorways that are labeled ($targetname) either interior or exterior and are given a #set of 1-3. <br><br>
|
||||
-tmstart is used to play one shot sounds
|
||||
</p>
|
||||
|
||||
<br>
|
||||
<b>Brushes</b>
|
||||
<br>
|
||||
<br>
|
||||
<p>
|
||||
- Skip brush can be used as a reference point when using the editor, since in the game it has no collision and doesn’t draw. <br><br>
|
||||
- Weapon clip blocks bullets. <br><br>
|
||||
- Area brush – creates vis for func_doors. Put these brushes INSIDE of your doors to block vis beyond them (since func_doors will not block vis into a room). <br><br>
|
||||
- Caulk Sky is a brush used for foggy levels… use this if your fog will obscure the skybox, negating the need to draw it. <br><br>
|
||||
- Clip brush clips just the player. Useful for keeping him out of areas. <br><br>
|
||||
- Clipall clips EVERYTHING. Bullets, player, AI, etc. <br><br>
|
||||
- Hint splits up vis. <br><br>
|
||||
- Material specific clips (carpet, grass, etc.) are for hit effects & sounds. <br><br>
|
||||
- Actor clip is for clipping AI, if you don’t want them to wander somewhere. <br><br>
|
||||
- Obscure brushes are to add realism to AI combat – they will confuse them as far as targeting goes. Good for placing in bushes and what not if you don’t want the AI to accurately target the player while he’s hiding in them.
|
||||
</p>
|
||||
|
||||
<br>
|
||||
<b>Random console commands</b>
|
||||
<br>
|
||||
<br>
|
||||
<p>
|
||||
- debug 1 at console brings up a bunch of neat debug info.<br><br>
|
||||
- Entering in g_scriptcheck 2 at the console will crash out the game if there are script errors <br><br>
|
||||
- ai_showroutes 1 in console shows AI pathing stuff <br><br>
|
||||
- ai_showpath1 / 2 can be used in conjunction with tele xyz to check for broken paths. <br><br>
|
||||
- timescale x speeds up the game by x amount. <br><br>
|
||||
- ai_delete 1 kills all AI in a level.
|
||||
</p>
|
||||
|
||||
</body>
|
||||
|
||||
|
||||
|
||||
<p>
|
||||
|
||||
</p>
|
||||
|
||||
|
||||
|
||||
<pre>
|
||||
<i><font color=blue>
|
||||
|
||||
</font>
|
||||
</i>
|
||||
</pre>
|
524
docs/MOH_game_commands_and_variables.html
Normal file
|
@ -0,0 +1,524 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>MOHAA - SDK</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<b><u><font size=+2><center>Useful in-game Medal of Honor: Allied Assualt commands</center></font></u></b>
|
||||
<br>
|
||||
<br>
|
||||
|
||||
<p>
|
||||
removeclass <class name> - Remove all objects derived from this classname<br>
|
||||
removeent <number> - remove a specific entity by number<br>
|
||||
killclass <class name> - apply a lethal amount of damage to all objects derived from this classname<br>
|
||||
killent <number> - kill a specific entity by number<br>
|
||||
whatis <number> - retrieve entity specific information by number<br>
|
||||
sv_showentnums [0,1] - show entity numbers above objects in the game<br>
|
||||
sv_showbboxes [0,28] - show bounding boxes of entities.<br>
|
||||
1 - shows all solid entities with their standard mins and maxs<br>
|
||||
2 - shows all solid entities with their absmins and absmaxs<br>
|
||||
3 - shows all entities that are solid and non solid but are not tagged as RF_DONTDRAW<br>
|
||||
4 - shows all entities, even those tagged as RF_DONTDRAW<br>
|
||||
7 - shows all entities with their TIKI bounding boxes<br>
|
||||
8 – shows normal bounding boxes as well as a small bounding box around the origin<br>
|
||||
9 – 28 – show bounding boxes of hit locations on models<br>
|
||||
actorinfo <number> - display actor specific information about a particular entity<br>
|
||||
testthread <thread label> - executes a thread from the command line<br>
|
||||
spawn classname <keyname> <value> … - spawn an entity<br>
|
||||
actor modelname <keyname> <value> … - spawn an actor <br>
|
||||
ai_shownodenums – show node numbers above ai path nodes<br>
|
||||
ai_showpath – show ai paths, the interconnections between ai path nodes<br>
|
||||
g_entinfo_max – maximum distance to show entity information<br>
|
||||
g_entinfo [0,4] – display information about entities as you get close to them. A non-zero value will cause all entities to run there ::ShowInfo method when the player gets near them.<br>
|
||||
<br>
|
||||
<br>
|
||||
|
||||
For Actors::<br>
|
||||
<b>G_entinfo 1</b><br>
|
||||
Green Line is between the actor’s centroid and his m_vHome position<br>
|
||||
Green circle represents his leash distance away from his home position<br>
|
||||
Red circle is his m_fMinDistance<br>
|
||||
Blue circle is his m_fMaxDistance<br>
|
||||
<b>G_entinfo 2</b><br>
|
||||
Red circle is his hearing<br>
|
||||
Blue circle is his sight<br>
|
||||
<b>G_entinfo 4 – show all actors all the time<br></b>
|
||||
<br>
|
||||
|
||||
<b><font size=+1>Cvar Documentation</font></b><br>
|
||||
NOTE: The CVAR documentation was created from an earlier iteration of the engine. Approximately 95% of the commands still work for MOHTA and are therefore valid.<br>
|
||||
<br>
|
||||
|
||||
</p>
|
||||
<pre>
|
||||
|
||||
- Version 1.1, June 16, 2002
|
||||
- Version 1.0, March 6, 2000
|
||||
|
||||
Legend
|
||||
=======
|
||||
S | ServerInfo Cvar
|
||||
U | UserInfo Cvar
|
||||
R | Read Only
|
||||
I | Initializing Cvar
|
||||
A | Archived Cvar
|
||||
L | Latched Cvar
|
||||
C| Cheat protected Cvar
|
||||
|
||||
Client Game
|
||||
===========
|
||||
A cg_3rd_person - determines whether player is 1st person or 3rd person view
|
||||
C cg_animspeed - debugging tool that lets use freeze all animations (default 1).
|
||||
A cg_autoswitch - vestigle Q3 variable
|
||||
A cg_cameradist - distance from the player to the 3rd person camera (default 150)
|
||||
A cg_cameraheight - height above player that 3rd person should pivot from (default 30)
|
||||
A cg_camerascale - lerping scale to smooth out 3rd person camera movement (defualt 0.2)
|
||||
A cg_cameraverticaldisplacement - vertical displacement from end point to 3rd person camera (defaule 24)
|
||||
C cg_debuganim - debug tool for animation. A value of 1 prints to the console, A value of 2 prints to the debug window.
|
||||
C cg_debuganimwatch - when using "cg_debuganim", which entity to watch for based off of entitynum
|
||||
cg_errordecay - player prediction adjustment that helps smooth out prediction errors (default 100)
|
||||
cg_eventlimit - maximum number of events to process per loop in the client game (default 500)
|
||||
cg_eventstats - statistical information on events in the client game
|
||||
cg_hidetempmodels - debugging tool to temporarily hide temp models.
|
||||
A cg_marks - whether polygonal marks should be added to the renderer.
|
||||
cg_nopredict - debugging tool to turn off client side predicition
|
||||
cg_norain - debugging tool to turn off rain
|
||||
U A cg_predictItems - vestigle Q3 variable
|
||||
cg_shadows - whether to draw shadows on certain entities. 1 is an ellipticle projected texture, 2 is a stencil buffer shadow and 3 is a
|
||||
fully rendered projected shadow
|
||||
cg_showemitters - debugging tool to show when emitters are active
|
||||
cg_showevents - debug tool to print out current client game events being processed
|
||||
cg_showmiss - debug tool to show prediction misses on client
|
||||
cg_showtempmodels - debug tool that prints out number of tempmodels currently being added to the renderer
|
||||
cg_stats - debug tool that prints out the current frame being rendered by the client
|
||||
A cg_stereosep - stereo separation for stereo view (default 0.4)
|
||||
cg_timeevents - debug tool that times the amount of time used by each event. If set to 2, output is re-directed to the console
|
||||
|
||||
AI/Routing
|
||||
==========
|
||||
ai_createnodes - when set to 1, path nodes will be generated when loading a map.
|
||||
ai_debuginfo - debug tool for path generation.
|
||||
ai_debugpath - debug tool for path searching.
|
||||
ai_shownodenums - debug tool which shows node numbers above path numbers
|
||||
ai_showroutes - debug tool that shows you current routes available
|
||||
ai_showroutes_distance - at what distance routes should be culled so that the renderer is not bogged down (default 1000)
|
||||
ai_timepaths - debug tool to show how long routing is taking. The value of this variable determines the minimum time cutoff to print out
|
||||
a path.
|
||||
|
||||
Client
|
||||
======
|
||||
activeAction - This will be executed upon receiving the first snapshot
|
||||
cl_avidemo - causes a screenshot to be spit out each client frame and sets client frametime to the variable of the value. ie a value of 20 is
|
||||
20 shots per second.
|
||||
A cl_cdkey - the CD authorization key needed to run the game
|
||||
cl_eventlimit - maximum number of events to process per loop in the client (default 500)
|
||||
cl_eventstats - statistical information on events in the client
|
||||
cl_freezeDemo - used to freeze a demo in place for single frame advances
|
||||
A cl_maxPing - maximum time to wait for a ping response (default 800)
|
||||
A cl_maxpackets - maximum number of client command packets to send per second (default 30)
|
||||
cl_motd - whether or not to query the MOTD server for the MOTD (default 1)
|
||||
cl_nodelta - when sending client movement commands, only send complete messages, do not send delta movement commands (default 0)
|
||||
A cl_packetdup - send this many previous client movement commands when sending a new one, this helps eliminate dropped packets (default 1)
|
||||
R cl_running - whether or not the client is currently running, gets set to 1 once the client has been initialized
|
||||
cl_showSend - debug tool that prints out information as to what is currently being sent by the client to the server
|
||||
cl_showTimeDelta - debug tool that shows the value used on the client to adjust client time so that it matches server time
|
||||
cl_showevents - debug tool to print out current client events being processed
|
||||
cl_timeNudge - allows you to manually adjust the TimeDelta between the client and server, pushing the client ahead or behind the server time.
|
||||
cl_timeevents - debug tool that times the amount of time used by each event. If set to 2, output is re-directed to the console
|
||||
cl_timeout - how long it takes for a server connection to time out in seconds (default 125)
|
||||
R cl_updateInfoString - holds the actual MOTD
|
||||
A model - what model the player should be using
|
||||
U A name - what the player should be called
|
||||
|
||||
Game Module
|
||||
===========
|
||||
csys_draw - debugging tool that allows you to draw a coordinate system
|
||||
csys_posx - origin x of the debugging csystem.
|
||||
csys_posy - origin y of the debugging csystem.
|
||||
csys_posz - origin z of the debugging csystem.
|
||||
csys_x - angles x of the debugging csystem.
|
||||
csys_y - angles y of the debugging csystem.
|
||||
csys_z - angles z of the debugging csystem.
|
||||
S dmflags - deathmatch flags for the current deathmatch server
|
||||
S fraglimit - what the fraglimit of the current deathmatch server is
|
||||
g_drawgravpath - debugging tool to show the gravity path nodes in action
|
||||
g_eventlimit - maximum number of events to process per loop in the client (default 5000)
|
||||
g_eventstats - statistical information on events in the client
|
||||
S L g_gametype - what kind of game is currently being run on the server (default 0)
|
||||
g_legclampangle - maximum angle at which legs are allowed to trail torso (default 65)
|
||||
g_legclamptolerance - tolerance scale for legs turning (default 90)
|
||||
g_legswingspeed - speed at which legs swing (default 300)
|
||||
g_legtolerance - tolerance in angles when legs turn (default 40)
|
||||
L g_numdebuglines - number of debug lines to be used for debugging purposes (default 4096)
|
||||
g_playermodel - the default player model to be used by the player (default julie)
|
||||
g_showautoaim - debug tool to show where the auto-aiming arms are pointing
|
||||
g_showaxis - debug tool to globally turn on or off axises when drawing debug coordinate systems
|
||||
g_showbullettrace - show the traces caused by bullets firing
|
||||
g_showevents - debug tool to print out current game events being processed
|
||||
g_showmem - show the amount of memory currently being used by the game's classes
|
||||
g_showplayeranim - debug tool that shows leg and torso anim changes
|
||||
g_showplayerstate - debug tool that shows leg and torso state changes
|
||||
g_statefile - state file that is used by the player (default global/julie)
|
||||
g_syncronousClients - only run the player movment code on the server when the game code thinks, do not perform any prediction
|
||||
g_timeents - debug tool that times how long it takes for each entity to "think", value sets the filter above which entities are printed
|
||||
g_timeevents - debug tool to pring out how long each event takes to process
|
||||
g_watch - when timing events, the entity to watch and print information out for.
|
||||
L maxentities - the maximum number of entities on a level (default 1024)
|
||||
S nomonsters - do not spawn any monsters when this is set
|
||||
S L skill - the skill level of the game (default 1, normal)
|
||||
S timelimit - the timelimit of a deathmatch game
|
||||
whereami - debugging tool that prints out the coordinates and yaw of the player whenever the player moves
|
||||
Server
|
||||
======
|
||||
C cm_noAreas - do not use areaportals, all areas are connected
|
||||
C cm_noCurves - do not collide against curves
|
||||
A C cm_playerCurveClip - collide player against curves
|
||||
S L deathmatch - whether the game is deathmatch or single player
|
||||
nextmap - the next map to run after this one, allows you to chain multiple maps together through the use of the ';'
|
||||
SU A parentmode - what level of violence the game should be using (default 0, excessive)
|
||||
sv_allowdownload - whether the server will allow data to be downloaded from it (default 1)
|
||||
sv_drawtrace - draw out all traces as debug lines
|
||||
S A sv_floodProtect - should the server protect itself from msg flooding (default 1)
|
||||
A sv_footsteps - should the server play footsteps on characters (default 1)
|
||||
S sv_fps - the simulation speed at which the server and game code is run (default 20)
|
||||
S sv_friction - global friction value for the world (default 4)
|
||||
sv_gibs - should we spawn giblets and other viscera
|
||||
sv_gore - should we spawn gory items in the game
|
||||
sv_gravity - global gravity level for the world (default 800)
|
||||
S A sv_hostname - the name of the server
|
||||
S sv_keywords - keywords that allow you to cull out potential clients if they are ineligible to connect (example 'demo')
|
||||
sv_killserver - debug tool to kill the server"0"
|
||||
R sv_mapChecksum - the 32-bit CRC checksum of the currently loaded map
|
||||
A sv_maplist - a list of maps to cycle through on the server
|
||||
sv_master1 - master server #1's address
|
||||
A sv_master2 - master server #2's address
|
||||
A sv_master3 - master server #3's address
|
||||
A sv_master4 - master server #4's address
|
||||
A sv_master5 - master server #5's address
|
||||
S A sv_maxRate - maximum rate at which data is sent to the client
|
||||
S L sv_maxclients - number of clients which can join a game
|
||||
sv_maxvelocity - global maximum velocity clamp
|
||||
sv_padPackets - pad outgoing packets with this many bytes
|
||||
R sv_paks - if running in sv_pure mode, contains the checksums of all the paks being used
|
||||
sv_precache - whether or not the server should precache data
|
||||
S sv_privateClients - number of reserved client slots to reserve on the client
|
||||
sv_privatePassword - password to allow one to play as a private client
|
||||
sv_pure - if true, the game does not allow any add-ons or modifications
|
||||
sv_reconnectlimit - how many times a client is allowed to re-connect before being disconnected (default 3)
|
||||
sv_rollangle - the amount of roll to be given to the player when he is banking in a turn (default 2)
|
||||
sv_rollspeed - the speed at which sv_rollangle is reset (default 200)
|
||||
R sv_running - this gets set when the server is initialized and running
|
||||
R sv_serverid - a unique id that is generated from the current game time when the server was started
|
||||
sv_showbboxes - show bounding boxes on all entities.
|
||||
1 - shows all solid entities with their standard mins and maxs
|
||||
2 - shows all solid entities with their absmins and absmaxs
|
||||
3 - shows all entities that are solid and non solid but are not tagged as RF_DONTDRAW
|
||||
4 - shows all entities, even those tagged as RF_DONTDRAW
|
||||
7 - shows all entities with their TIKI bounding boxes
|
||||
8 – shows normal bounding boxes as well as a small bounding box around the origin
|
||||
9 – 28 – show bounding boxes of hit locations on models
|
||||
sv_showcameras – displays the cameras and their spline paths
|
||||
sv_showentnums - shows the entity numbers above each entity
|
||||
S sv_stopspeed - how fast physical objects in the world should slow down (default 100)
|
||||
sv_timeout - how long to wait in seconds before dropping a player who hasn't sent any commands (default 120)
|
||||
sv_traceinfo - print out how many traces were performed each server frame. If greater than 1, than specific information about each trace is
|
||||
also printed. If greater than 2, than all printing is done to the debugger window.
|
||||
S sv_waterfriction - the fricition when inside a water volume (default 1)
|
||||
S sv_waterspeed - the speed at which you can move through water (default 400)
|
||||
sv_zombietime - how long to keep a client connected to the server after they have been dropped (default 2)
|
||||
|
||||
Sound
|
||||
=====
|
||||
s_debugmusic - debug tool that prints out the current action level in the game, helps determine when music changes based on context
|
||||
s_initsound - whether or not to startup the sound system (default 1)
|
||||
A s_khz - the default mixing rate in Khz (default 22)
|
||||
A s_loadas8bit - purposely down sample all samples to 8-bit (default 0)
|
||||
A s_milesdriver - which sound driver to use for the audio system. Valid sound drivers are: miles, dolby, A3D, A3D2, EAX and EAX2
|
||||
A s_mixPreStep - this is a pre-mix step for global sound time, not sure what it actually accomplishes (default 0.05 seconds)
|
||||
A s_mixahead - how far ahead into the future the sound system should mix (default 0.2 seconds)
|
||||
A s_musicvolume - the volume of the music (default 0.55)
|
||||
A s_reverb - whether or not reverb should be on (default on)
|
||||
A s_separation - how much stereo separation should exist (default 0.5)
|
||||
C s_show - debugging info for the sound system
|
||||
s_show_cpu - show CPU utilization by the sound system
|
||||
s_show_num_active_sounds - debugging tool to show how many sounds are currently active
|
||||
s_show_sounds - debugging tool that shows current sound related happenings
|
||||
A s_speaker_type - what kind of speaker setup the user is using. (0 - 2 speaker setup, 1 - headphones, 2 - surround sound, 3 - 4 speaker setup)
|
||||
C s_testsound - debugging tool that plays a simple sine wave tone
|
||||
A s_usemiles - whether or not to use the miles sound system
|
||||
A s_volume - the sound volume "1"
|
||||
|
||||
Network
|
||||
=======
|
||||
cg_lagometer - network debugging tool that graphically shows your current latency
|
||||
cl_shownet - massive debug tool that shows you the current incoming traffic on the client. 1 shows the size of each server message, 2 shows
|
||||
you the beginning of each server message and the size of each packet componenet. 3 shows you detailed information about entity
|
||||
network deltas.
|
||||
filterban - whether or not to turn on ip banning, if set to 1 than anyone on the current list will be banned, if set to 0 than only addresses
|
||||
on the list will be allowed (default 1)
|
||||
flood_msgs - not implmented currently (default 4)
|
||||
flood_persecond - not implmented currently (default 4)
|
||||
flood_waitdelay - not implmented currently (default 10)
|
||||
I net_ip - what IP address to use for this server in case you have multiple servers on the same machine (default localhost)
|
||||
AL net_noipx - do not use the IPX protocol
|
||||
AL net_noudp - do not use the UDP protocol
|
||||
I net_port - the network port to use.
|
||||
I net_qport - quake network port to be used internally by the network system
|
||||
AL net_socksEnabled - enable SOCKS server support (default 0)
|
||||
AL net_socksPassword - SOCKS server password (default "")
|
||||
AL net_socksPort - SOCKS server port (default 1080)
|
||||
AL net_socksServer - SOCKS server address (default "")
|
||||
AL net_socksUsername - SOCKS server userid (default "")
|
||||
S R protocol - which network protocol is currently being used by the client, set by the system
|
||||
public - whether or not this server is public and should send heart beats to the master server (default 0)
|
||||
U A rate - the maximum number of bytes to be sent to the client per second (default 3000)
|
||||
rconAddress - the address of the server you want to send rcon messages to.
|
||||
rconPassword - the password that is sent for rcon commands
|
||||
showdrop - debug tool to show dropped packets (default 0)
|
||||
showpackets - show packets as they are sent to and from the client and server
|
||||
U A snaps - number of snapshots the client wants to receive per second (default 20)
|
||||
|
||||
Renderer
|
||||
========
|
||||
AL r_allowExtensions - enables OPENGL extensions (default 1)
|
||||
L r_allowSoftwareGL - allow software OPENGL, normally this would be really slow (default 0)
|
||||
C r_ambientScale - a global scale factor for all ambient lighting on models and characters (default 0.5)
|
||||
C r_clear - whether or not to explicitly clear the screen (default 0)
|
||||
L r_colorMipLevels - debug tool to artificially color different mipmap levels so that they are more apparent (defaul 0)
|
||||
AL r_colorbits - what color depth the renderer should use, if 0 then the desktop depth will be used by default (default 0)
|
||||
AL r_customaspect - custom aspect ratio to use when in r_mode -1 (default aspect ration 1)
|
||||
AL r_customheight - custom screen height to use when in r_mode -1 (default 1024)
|
||||
AL r_customwidth - custom screen width to use when in r_mode -1 (default 1600)
|
||||
C r_debugSort - debug tool that only renderes those sort layers that are greater than the value of the variable (default 0)
|
||||
C r_debugSurface - debug tool which renders a custom surface for patch collision debugging
|
||||
r_debuglight - debug tool that prints out entity lighting information
|
||||
A r_debuglines_depthmask - when rendering debug lines whether or not to render them with Z information (default 0)
|
||||
AL r_depthbits - how much precision there should be in the Z-buffer, if left at 0, z precision is automatically calculated (default 0)
|
||||
AL r_detailtextures - whether or not to render detail shader stages (default 1)
|
||||
C r_directedScale - a global scale factor for all direct lighting on models and characters (default 1)
|
||||
L r_displayRefresh - if non-zero, what the display refresh rate should be set at (default 0)
|
||||
A r_dlightBacks - whether or not dynamic lights should light up back-face culled geometry (default 1)
|
||||
r_drawBuffer - which buffer to render to, (default GL_BACK)
|
||||
A r_drawSun - whether or not to draw the sun in the sky (default 0)
|
||||
C r_drawentities - debug tool that allows you to turn off entities (default 1)
|
||||
C r_drawsprites - debug tool that allows you to turn off sprites (default 1)
|
||||
C r_drawworld - debug tool that allows you to turn off world rendering (default 1)
|
||||
A r_dynamiclight - whether or not to render dynamic lights (default 1)
|
||||
AL r_ext_compiled_vertex_array - whether or not to use the Compiled Vertex Arrray GL extension (default 1)
|
||||
AL r_ext_compress_textures - whether or not to use the S3 texture compression extension (default 1)
|
||||
AL r_ext_gamma_control - whether or not to use the GAMMA extension (default 1)
|
||||
AL r_ext_multitexture - whether or not to use the ARB multi-texture extention (default 1)
|
||||
AL r_ext_texture_env_add - whether or not to use the GL_TEXTURE_ENV_ADD extenstion (default 1)
|
||||
A r_ext_texture_env_combine - whether or not to use the GL_TEXTURE_ENV_COMBINE extenstion (default 0)
|
||||
A r_facePlaneCull - whether or not to perform back face culling on simple surfaces (default 1)
|
||||
r_farplane - debug tool to turn on the far clipping plane, the variable defines the distance of the plane (default 0)
|
||||
r_farplane_color - debug tool to set the color of the far clipping plane, (default medium gray ".5 .5 .5")
|
||||
r_farplane_nocull - debug tool to set whether or not to purposely not cull geometry with the far plane (default 0)
|
||||
A r_fastdlights - if renderer is compiled with REAL_DYNAMIC_LIGHTING, determines whether or not use real method or fast method (default 0)
|
||||
A r_fastsky - don't render the sky, just clear it with the current sky color (default 0)
|
||||
A r_finish - force a glFinish call after rendering a scene (default 0)
|
||||
C r_flareFade - how long light coronas should fade when on the screen or off the screen (default 7)
|
||||
C r_flareSize - the size of the light coronas (default 40)
|
||||
A r_flares - whether or not to render the light coronas (default 0)
|
||||
LC r_fullbright - debug tool to render the entire level without lighting (default 0)
|
||||
AL r_fullscreen - whether or not to go into fullscreen mode or not (default 1)
|
||||
A r_gamma - the current renderer gamma (default 1)
|
||||
AL r_glDriver - the video driver to use (default opengl32)
|
||||
C r_ignore - debug cvar that is used in various places throughout the code to zero out variables (default 1)
|
||||
AL r_ignoreFastPath - do not use fast shader rendering path of either diffuse lighting or multi-texture lighting (default 1)
|
||||
A r_ignoreGLErrors - ignore GL errors as they occur (default 1)
|
||||
AL r_ignorehwgamma - ignore hardware gamma and use the texture method of gamma adjustment (default 0)
|
||||
L r_intensity - global texture lighting scale (default 1)
|
||||
A r_lastValidRenderer - last valid renderer to function. Used as a debugging tool.
|
||||
r_lerpmodels - whether or not to interpolate character models (default 1)
|
||||
r_light_emphasize - global amount that is added to sphere-based character lighting (default 0)
|
||||
r_light_emphasizePercent - the additional percentage amount of emphasis to be givent to sphere-based character lighting (default 0)
|
||||
A r_light_int_scale - debugging tool that shows intensity of lights in the scene by length of the line drawn (default 0.05)
|
||||
A r_light_lines - debugging tool that shows which lights affect which characters (default 0)
|
||||
A r_light_nolight - debugging tool to turn off all lighting calculations and just use an ambient lighting value for all characters (default 0)
|
||||
A r_light_sun_line - debugging tool that shows which characters are affected by the sun. (default 0)
|
||||
A r_lightcoronasize - the size of the corona to be used when renderering lens flares (default 0.1)
|
||||
r_lightmap - debugging tool that renders lightmaps in GL_REPLACE mode so that they can be seen without their base textures (default 0)
|
||||
C r_lockpvs - lock the current PVS in, so that you can wander around and see what is visibile and what isn't (default 0)
|
||||
A r_lodCurveError - maximum curve error, before subdividing (default 250)
|
||||
A r_lodbias - an absolute offset to artificially make characters further away so that they are rendered with fewer polygons (default 0)
|
||||
C r_lodscale - a lod scale that artificially distorts the rate at which polygons drop away from characters (default 5)
|
||||
C r_logFile - when true, dumps out all render commands to a file called gl.log (default 0)
|
||||
L r_mapOverBrightBits - the number of overbright bits baked into all lightmaps and map data (default 2)
|
||||
L r_maskMinidriver - if set to 1, then a mini driver will be treated as a normal ICD (default 0)
|
||||
C r_measureOverdraw - when set to 1, and if the hardware supports a stencil buffer, overdraw will be reported (default 0)
|
||||
AL r_mode - what video mode the renderer should be in (default 3)
|
||||
C r_nobind - debugging tool to turn off all texture binding (default 0)
|
||||
C r_nocull - debugging tool to turn off all culling (default 0)
|
||||
C r_nocurves - debugging tool to turn off all curves (default 0)
|
||||
C r_noportals - deubbing tool to turn off all portals (defualt 0)
|
||||
C r_norefresh - turn off all rendering (default 0)
|
||||
C r_novis - debugging tool to turn off vis information (default 0)
|
||||
C r_offsetfactor - polygon offset factor for shader stages that have polygon offset set (default -1)
|
||||
C r_offsetunits - polygon offset units for shader stages that have polygong offset set (default -2)
|
||||
AL r_overBrightBits - how many overBrightBits to actually use when rendering, if non-zero, world will look saturated when bright. (default 0)
|
||||
AL r_picmip - what starting level mipmap level all images should start on. Global variable that can dramatically decrease texture size
|
||||
(default 0)
|
||||
A r_place_sunflare - debugging tool that allows you to interactively place the sun flare (defualt 0)
|
||||
C r_portalOnly - debugging tool that only draw what is rendered by the portal, not the regular scene. (default 0)
|
||||
A r_primitives - which drawing primitives to use when rendering. 0 - auto select, 1 - single glDrawElements, 2 - multiple glDrawElements,
|
||||
3 - multiple color+texcoords+vertex (default 0)
|
||||
r_printShaders - debugging tool that prints out all the shaders that are actually used when loading a level. It is used to generate a
|
||||
pak file (default 0)
|
||||
A r_railCoreWidth - Q3 vestigle "16"
|
||||
A r_railSegmentLength - Q3 vestigle "64"
|
||||
A r_railWidth - Q3 vestigle "128"
|
||||
AL r_roundImagesDown - when images are scaled, round images down instead of up (default 1)
|
||||
r_showImages - renders all images currently loaded. If set to 2, will render them proportionately (default 0)
|
||||
C r_showSmp - will show SMP activity while rendering (default 0)
|
||||
C r_showcluster - debugging tool that prints out current area and cluster (default 0)
|
||||
r_showlod - debugging tool that prints out statistics on the LODing of characters (default 0)
|
||||
C r_shownormals - debugging tool that shows the normals of all triangles being renderered (default 0)
|
||||
C r_showskel - debugging tool that shows the skeleton and not the surfaces of all skeletal characters (default 0)
|
||||
C r_showsky - debugging tool that renders the sky in front of everything else so you can see how much of the sky is being rendered (defualt 0)
|
||||
C r_showtris - debugging tool that shows the outlines of all the triangles being rendered (default 0)
|
||||
AL r_simpleMipMaps - whether or not to use the simple mip map generation tool or a more correct one (default 1)
|
||||
LC r_singleShader - debugging tool that only uses the default shader for all rendering (default 0)
|
||||
C r_skipBackEnd - debugging tool that skips the rendering of the back end (default 0)
|
||||
r_skyportal - debugging tool that turns on a sky portal (default 0)
|
||||
r_skyportal_origin - debugging tool that sets the origin for the sky portal (default "0 0 0")
|
||||
AL r_smp - whether or not to turn on SMP support for the renderer (default 0)
|
||||
C r_speeds - debugging tool that prints out information about the renderer. 1 - prints out shaders/surfs, leafs, verts, tris, mtex and dc
|
||||
2 - prints out culling statiistics, 3 - prints our viewcluster, 4 - prints our dynamic lighting information, 5 - prints out Z
|
||||
info, 6 - prints out flare info
|
||||
AL r_stencilbits - how many bits to use for the stencil buffer (default 8)
|
||||
AL r_stereo - whether or not stereo rendering is enabled (default 0)
|
||||
A r_stipplelines - enable stipple line support for debug lines (default 0)
|
||||
AL r_subdivisions - scale factor for curve subdivision, used to pre-tesselate curved surfaces more or less (default 4)
|
||||
r_sunflare - debugging tool which contains the location of the sun (default 0)
|
||||
r_sunflare_inportalsky - debugging tool for placing the sunflare, set this to one when the sun is in a portal sky (default 0)
|
||||
A r_swapInterval - set the OPENGL swap interval (default 0)
|
||||
A r_textureMode - the texture mode for all textures (default "GL_LINEAR_MIPMAP_NEAREST")
|
||||
AL r_texturebits - the number of bits to use for textures (default 16)
|
||||
A r_useglfog - whether or not to use standard OPENGL for characters (default 1)
|
||||
C r_verbose - turns on additional startup information when renderer is starting up (default 0)
|
||||
AL r_vertexLight - turn on vertex lighting on all world surfaces. Disables multi-texture (default 0)
|
||||
C r_znear - near Z clipping plane (default 4)
|
||||
|
||||
Input System
|
||||
============
|
||||
cl_anglespeedkey - when turning with the keyboard, how fast to turn (default 1.5)
|
||||
cl_debugMove - debug tool that prints out information about the current input. If set to 1, a graph of yaw will be displayed, if set to 2,
|
||||
a graph of pitch will be displayed
|
||||
A cl_mouseAccel - mouse acceleration factor (default 0)
|
||||
A cl_pitchspeed - scale factor for how fast view pitch will be adjusted (default 140)
|
||||
A cl_run - turns on auto-run for the client (default 1)
|
||||
cl_showmouserate - debug tool that shows the speed of the mouse
|
||||
A cl_yawspeed - scale factor for how fast view yaw will be adjusted (default 140)
|
||||
A freelook - whether or not the mouse affects the view directly or is used for driving the player around (default 1)
|
||||
in_debugjoystick - debugging tool for the joystick (default 0)
|
||||
A in_joyBallScale - if the joystick has a trackball like interface, this is used to scale that input for view (default 0.02)
|
||||
AL in_joystick - whether or not joystick is on (default 0)
|
||||
A in_midi - turn on midi support (default 0)
|
||||
A in_midichannel - when midi support is on, what channel to use (default 1)
|
||||
A in_mididevice - when midi support is on, what midi device to use (default 0)
|
||||
AL in_mouse - whether or not mouse support is on, if set to -1 DirectInput will not be queried (default 1)
|
||||
A joy_threshold - the threshold of movement when movement on the joystick registers, allows you to define the deadzone of the stick
|
||||
(default 0.15)
|
||||
A m_filter - whether or not to turn on mouse filtering by averaging the last and current input (default 0)
|
||||
A m_forward - mouse scale for applying y-axis mouse motion to character forward movement (default 1)
|
||||
A m_pitch - mouse scale for applying y-axis mouse motion to view pitch (default 0.022)
|
||||
A m_side - mouse scale for applying x-axis mouse motion for character side movement (default 0.8)
|
||||
A m_up - mouse scale for applying y-axis mouse motion to character vertical movement (default 0)
|
||||
A m_yaw - mouse scale for applying x-axis mouse motion to view yaw (default 0.022)
|
||||
A sensitivity - mouse sensitivity (default 5)
|
||||
|
||||
User Interface
|
||||
==============
|
||||
crosshair - whether or not the crosshair is on (default 1)
|
||||
ui_backgroundMouse - places the light source for the sleepy hollow effect behind the logo instead of in front of it.
|
||||
A ui_consoleposition - the current x,y position of the console along with its width and height
|
||||
ui_drawcoords - debugging tool to print out the currenty coordinates of the mouse cursor (default 0)
|
||||
ui_hud - whether or not the HUD is drawn (default 1)
|
||||
ui_minicon - whether or not the mini console is drawn (default 1)
|
||||
|
||||
File System
|
||||
===========
|
||||
I fs_basepath - the basepath of the game
|
||||
I fs_cdpath - the CD basepath of the game
|
||||
I fs_copyfiles - whether or not to copy files when loading them into the game. Every file found in the cdpath will be copied over
|
||||
to the basepath
|
||||
fs_debug - debugging tool for the filesystem
|
||||
fs_filedir - the current directory for the CD and DIR commands
|
||||
S I fs_game - specify an alternate Game directory for add-ons
|
||||
I fs_restrict - allows you to restrict access to modified data for add-on purposes
|
||||
mapdir - when using the MAP command, automatically prepends the value of this variable to the map name
|
||||
|
||||
General / Common
|
||||
=======
|
||||
cgamedll - the CGAMEDLL to use for the game
|
||||
S R L cheats - whether or not cheats are enabled
|
||||
A com_blood - whether or not blood is on for the game
|
||||
com_buildScript - for automatic script/pak building, not currently functional
|
||||
C com_dropsim - debugging tool to simulate dropped packets, specifies percentage of packets to drop (default 0)
|
||||
AL com_hunkMegs - number of megs to allocate for the hunk (default 12)
|
||||
A com_introplayed - whether or not the intro for the game has been played (default 0)
|
||||
A com_maxfps - the maximum frames per second allowable (default 1000)
|
||||
C com_showtrace - debugging tool that prints out trace information (default 0
|
||||
com_speeds - debugging tool that shows the time spent in various modules of the game. If set to 3, SV_PacketEvents will also be timed"0"
|
||||
config - the config file to use for the game
|
||||
I L dedicated - whether or not the server is dedicated
|
||||
A developer - whether or not development mode is on
|
||||
C fixedtime - when non-zero, locks the msecs per frame (default 0)
|
||||
A fps - debugging tool that prints out the FPS statistics at the bottom left of the screen. If set to one, a warning sound will be played
|
||||
when the framerate drops below 18 FPS.
|
||||
gamedll - the GAMEDLL currently being used by the game
|
||||
I journal - if 1 than all events will be journaled to journal.dat and journaldata.dat. If set to 2, than all journal events will be
|
||||
played back
|
||||
logfile - whether or not to turn on console logging. All console output is dumped qconsole.log
|
||||
S R mapname - the current name of the loaded map
|
||||
U password - password needed to connect to this server
|
||||
R paused - whether or not the game is currently paused
|
||||
C timedemo - run a demo at full speed for performance testing
|
||||
C timescale - global timescale that allows you to slow down or speed up the game
|
||||
username - current user logged onto this machine
|
||||
S R version - the version of the current build
|
||||
C viewlog - whether or not the console at the beginning of the game should be: 0 - hidden, 1 - window sized with scroll, or 2 - minimized
|
||||
|
||||
System
|
||||
======
|
||||
arch - the current architecture being used by this machine
|
||||
sys_cpuid - the cpuid of the current processor
|
||||
sys_cpustring - the type of CPU currently being used
|
||||
|
||||
Windows Specific
|
||||
================
|
||||
R win_hinstance - the HINSTANCE of the current application
|
||||
R win_wndproc - the WNDPROC of the current application
|
||||
|
||||
Video System
|
||||
============
|
||||
C debuggraph - whether or not to render the debuggraph
|
||||
C graphheight - the height of a degbuggraph or timegraph (default 32)
|
||||
C graphscale - the scale of a debuggraph or timegraph (default 1)
|
||||
C graphshift - the offset of a debuggraph or timegraph (default 0)
|
||||
C timegraph - debug tool that prints out the current timing of the game (default 0)
|
||||
A vid_xpos - the X position of the screen (default 0)
|
||||
A vid_ypos - the Y position of the screen (default 0)
|
||||
A viewsize - percentage factor of how fullscreen the view you should be (default 100)
|
||||
|
||||
|
||||
</pre>
|
||||
|
||||
</body>
|
||||
|
||||
|
||||
|
||||
<p>
|
||||
|
||||
</p>
|
||||
|
||||
|
||||
|
||||
<pre>
|
||||
<i><font color=blue>
|
||||
|
||||
</font>
|
||||
</i>
|
||||
</pre>
|
BIN
docs/MOH_particles/1-1.jpg
Normal file
After Width: | Height: | Size: 230 KiB |
267
docs/MoH Radiant Feature.html
Normal file
|
@ -0,0 +1,267 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>MOHAA - SDK</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<b><u><font size=+2>"MOH Radiant" Key Feature List:</font></u></b>
|
||||
<br>
|
||||
<br>
|
||||
<b>1. Interface & Control Improvements</b>
|
||||
<br>
|
||||
<pre>
|
||||
a. 3 different user camera manipulation modes available
|
||||
b. “Paint” select/deselect of surfaces (drag cursor continuously to select/deselect)
|
||||
c. Texture search by material/structure keyword
|
||||
d. Built-in lighting preview
|
||||
e. Rotation of brushes made more reliable – brushes less likely to fowl up on rotate
|
||||
f. Improved copy-paste-clone functions
|
||||
g. Per curve adjustable subdivision level
|
||||
h. Option to draw textures in the orthographic view ports
|
||||
i. Ruler Tool for measuring distances in world units
|
||||
j. Option for transparent surfaces in 3D preview
|
||||
k. Texture alignment and rotation using the mouse
|
||||
l. More selection options:
|
||||
i. Select complete entity
|
||||
ii. Select Entities of type
|
||||
iii. Select Entities with targetname
|
||||
iv. Select connected entities
|
||||
v. Select untextured
|
||||
vi. Select terrain faces tall
|
||||
vii. Select all from texture
|
||||
</pre>
|
||||
|
||||
<br>
|
||||
<br>
|
||||
<b>2. Terrain System Tools</b>
|
||||
<br>
|
||||
<pre>
|
||||
a. Create, link, detach, and manipulate terrain patches to create outdoor ground areas
|
||||
b. Export/import terrain height maps to .TGA image format
|
||||
c. Adjustable draw distance for terrain independent of normal distance culling
|
||||
d. Manual controls for changing terrain LOD on a per-triangle basis (facet flags)
|
||||
e. Lock vertices on terrain to prevent accidental vertex manipulations
|
||||
f. “Paint” select/deselect terrain patches and triangles
|
||||
</pre>
|
||||
<Br>
|
||||
<br>
|
||||
<b>3. Manual Visibility Editing</b>
|
||||
<br>
|
||||
<br>
|
||||
<b><u><font size=+1>Compiler Features (Q3MAP & MoHLIGHT compiling tools):</font></u></b>
|
||||
<br>
|
||||
<br>
|
||||
<pre>
|
||||
1. Radiosity
|
||||
2. Diffuse Sunlight
|
||||
3. Variable blocksize
|
||||
4. Manual Visibility
|
||||
5. Surface Flags
|
||||
</pre>
|
||||
|
||||
<br>
|
||||
<br>
|
||||
<b><u><font size=+1>MoH Radiant Key Assignments</font></u></b>
|
||||
<br>
|
||||
|
||||
<pre>
|
||||
FileNew = Ctrl-N
|
||||
FileOpen = Ctrl-O
|
||||
FileSave = Ctrl-S
|
||||
Undo = Ctrl-Z
|
||||
Copy = Ctrl-C
|
||||
Paste = Ctrl-V
|
||||
NextView = Ctrl-TAB
|
||||
CenterView = End
|
||||
UpFloor = PageUp
|
||||
DownFloor = PageDown
|
||||
ZoomOut = Insert
|
||||
ZoomIn = Delete
|
||||
ZZoomOut = Ctrl-Insert
|
||||
ZzoomIn = Ctrl-Delete
|
||||
FilterWorldBrushes = Alt-1
|
||||
FilterEntities = Alt-2
|
||||
FilterPatches = Alt-3
|
||||
FilterTranslucent = Alt-4
|
||||
FilterLiquids = Alt-5
|
||||
FilterCaulk = Alt-6
|
||||
FilterClips = Alt-7
|
||||
FilterPaths = Alt-8
|
||||
FilterAINodes = Alt-9
|
||||
FilterLights = Alt-0
|
||||
FilterDetails = Ctrl-D
|
||||
FilterHintsSkips = Ctrl-H
|
||||
FilterModels = Ctrl-M
|
||||
FilterAreaportals = Ctrl-P
|
||||
FilterTriggers = Ctrl-T
|
||||
CameraFromEntity = Ctrl-J (set the camera view based on the selected entity)
|
||||
CameraToEntity = Ctrl-Shift-J (set the entity angles key based on the camera)
|
||||
CameraGridMove = /
|
||||
CubicClipZoomOut = ]
|
||||
CubicClipZoomIn = [
|
||||
ToggleSizePaint = Shift-Q (turns on/off the selection size display)
|
||||
CenterXYFromCamera = Alt-X
|
||||
DragEdges = E
|
||||
DragVertices = V
|
||||
CloneSelection = Space (replaces target/targetname key values with new names)
|
||||
CloneSelectionExact = Ctrl-Space (does not change target/targetname key values)
|
||||
UnSelectSelection = Escape
|
||||
DeleteSelection = BackSpace
|
||||
SelectCompleteEntity = Ctrl-E
|
||||
SnapPatchToGrid = Ctrl-G
|
||||
SelectClampPlanePoints = Ctrl-Shift-G
|
||||
IncreaseLightmapDensity = Ctrl-]
|
||||
DecreaseLightmapDensity = Ctrl-[
|
||||
MouseRotate = R
|
||||
MouseScale = L
|
||||
ToggleClipper = X
|
||||
FlipClip = `
|
||||
ClipSelected = Return
|
||||
SplitSelected = Shift-Return
|
||||
EntityColor = K
|
||||
ConnectSelection = Ctrl-K
|
||||
MakeDetail = Ctrl-Shift-D
|
||||
MakeStructural = Ctrl-Alt-D
|
||||
ToggleDetail = Ctrl-Alt-Shift-D
|
||||
SetGrid1 = 1
|
||||
SetGrid2 = 2
|
||||
SetGrid4 = 3
|
||||
SetGrid8 = 4
|
||||
SetGrid16 = 5
|
||||
SetGrid32 = 6
|
||||
SetGrid64 = 7
|
||||
ShowAllTextures = Ctrl-A
|
||||
ShowInUseTextures = U
|
||||
SurfaceInspector = S
|
||||
CloseSurfDialog = Shift-Escape
|
||||
PatchInspector = P
|
||||
TextureFit = Ctrl-F
|
||||
ToggleMoveLock = Shift-M (keeps texture alignment as brushes are moved)
|
||||
ToggleRotateLock = Shift-R (keeps texture rotations as brushes are rotated)
|
||||
NextLeakSpot = Ctrl-L
|
||||
PrevLeakSpot = Shift-L
|
||||
Brush3Sided = Ctrl-3
|
||||
Brush4Sided = Ctrl-4
|
||||
Brush5Sided = Ctrl-5
|
||||
Brush6Sided = Ctrl-6
|
||||
Brush7Sided = Ctrl-7
|
||||
Brush8Sided = Ctrl-8
|
||||
Brush9Sided = Ctrl-9
|
||||
InvertCurve = Ctrl-I
|
||||
BendMode = Ctrl-B
|
||||
PatchTAB = TAB
|
||||
TogglePatchOverlay = Ctrl-Y
|
||||
IncreaseSubdivisions = Shift-]
|
||||
DecreaseSubdivisions = Shift-[
|
||||
ThickenPatch = Ctrl-T
|
||||
ViewEntityInfo = N
|
||||
ViewConsole = O
|
||||
ViewTextures = T
|
||||
CameraForward = Up
|
||||
CameraBack = Down
|
||||
CameraLeft = Left
|
||||
CameraRight = Right
|
||||
CameraUp = D
|
||||
CameraDown = C
|
||||
CameraAngleUp = A
|
||||
CameraAngleDown = Z
|
||||
CameraStrafeRight = Period
|
||||
CameraStrafeLeft = Comma
|
||||
CameraGridForward = Ctrl-Forward
|
||||
CameraGridBack = Ctrl-Back
|
||||
CameraGridStrafeRight = Ctrl-Period
|
||||
CameraGridStrafeLeft = Ctrl-Comma
|
||||
CameraFastForward = Shift-Forward
|
||||
CameraFastBack = Shift-Back
|
||||
CameraFastStrafeRight = Shift-Period
|
||||
CameraFastStrafeLeft = Shift-Comma
|
||||
IncreaseLightRadius = Alt-]
|
||||
DecreaseLightRadius = Alt-[
|
||||
TexRotateClock = Shift-PgDn
|
||||
TexRotateCounterClock = Shift-PgUp
|
||||
TexDecrement = Shift-(minus)
|
||||
TexIncrement = Shift-(add)
|
||||
MoveSelectionUp = Add
|
||||
MoveSelectionDown = Subtract
|
||||
SelectNudgeLeft = Alt-Left
|
||||
SelectNudgeRight = Alt-Right
|
||||
SelectNudgeUp = Alt-Up
|
||||
SelectNudgeDown = Alt-Down
|
||||
|
||||
For additional commands that can be bound to key combinations, look at the radiant.ini file in your radiant directory.
|
||||
Note that the file in o:\fakkutils\radiant.ini will contain the latest command list.
|
||||
|
||||
Camera Button Assignments
|
||||
|
||||
LBUTTON = Drag brush
|
||||
LBUTTON & CONTROL = Shear brush
|
||||
LBUTTON & SHIFT = Select whole brush
|
||||
LBUTTON & SHIFT & CONTROL = Select single face
|
||||
|
||||
MBUTTON = Grab texture and state
|
||||
MBUTTON & ALT = Grab texture name into current state
|
||||
MBUTTON & SHIFT = When used with a light, it makes the
|
||||
light color the texture color
|
||||
MBUTTON & CONTROL = Set entire brush to texture
|
||||
MBUTTON & CONTROL & SHIFT = Set single face to texture
|
||||
|
||||
RBUTTON = Drive with mouse
|
||||
RBUTTON & CONTROL = Move camera
|
||||
RBUTTON & ALT = Translate texture
|
||||
RBUTTON & ALT & SHIFT = Scale texture
|
||||
RBUTTON & ALT & CONTROL = Rotate texture
|
||||
|
||||
XY/XZ/YZ Button Assignments
|
||||
|
||||
ARROWS & SHIFT = Move faster
|
||||
ARROWS & CONTROL = Move in grid units
|
||||
|
||||
LBUTTON = Move/Create brush
|
||||
Move clip point
|
||||
LBUTTON & CONTROL = Shear brush
|
||||
LBUTTON & SHIFT = Select entire brush
|
||||
Select entire patch row/col
|
||||
LBUTTON & CONTROL & SHIFT = Select single face
|
||||
|
||||
MBUTTON = Change camera angle
|
||||
MBUTTON & SHIFT = Move Z checker
|
||||
MBUTTON & CONTROL = Move camera
|
||||
|
||||
RBUTTON = Scroll window
|
||||
RBUTTON & CONTROL = Place clip point
|
||||
RBUTTON & SHIFT = Move free rotation origin
|
||||
Move patch bend origin
|
||||
|
||||
Texture Button Assignments
|
||||
|
||||
LBUTTON = Select texture
|
||||
LBUTTON & SHIFT = Select name only
|
||||
LBUTTON & CONTROL = Edit shader in ShaderED
|
||||
LBUTTON & CONTROL & SHIFT = Edit shader in EditPad
|
||||
|
||||
MBUTTON & CONTROL = Select all brushes with texture
|
||||
MBUTTON & CONTROL & SHIFT = Select all faces with texture
|
||||
|
||||
RBUTTON = Scroll window
|
||||
RBUTTON & SHIFT = Scroll window fast
|
||||
|
||||
|
||||
|
||||
</pre>
|
||||
|
||||
</body>
|
||||
|
||||
|
||||
|
||||
<p>
|
||||
|
||||
</p>
|
||||
|
||||
|
||||
|
||||
<pre>
|
||||
<i><font color=blue>
|
||||
|
||||
</font>
|
||||
</i>
|
||||
</pre>
|
1548
entities.cpp
Normal file
65
index.html
Normal file
|
@ -0,0 +1,65 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>MOHAA - SDK</title>
|
||||
</head>
|
||||
|
||||
<body bgcolor="#000000" text="#ffffff">
|
||||
<center><img src="mohaas_ingame_logo.jpg"></center>
|
||||
<b><u><font size=+2><center>Medal of Honor SDK</center></font></u></b>
|
||||
<br>
|
||||
<br>
|
||||
<I><B><font size=+1><u>Documents</u></font></b></I>
|
||||
<br>
|
||||
<p>
|
||||
<font size=+1>Introduction</font><br>
|
||||
<a href="docs/MOH Getting Started Tutorial.htm">MOH Editing - Getting Started Tutorial</a><br>
|
||||
<br><font size=+1>Server/Game Reference</font><br>
|
||||
<a href="docs/MOH_GameClasses.html">MOH Game Classes</a><br>
|
||||
<a href="docs/Coordinate_system_documentation.html">MOH Coordinate System</a><br>
|
||||
<a href="docs/MOH Miscellaneous Script Documentation.html">MOH Script Documentation</a><br>
|
||||
<a href="docs/MOH_AI_tips.html">MOH AI Tips</a><br>
|
||||
<a href="docs/MOH_game_commands_and_variables.html">MOH Game Commands and Variables</a><br>
|
||||
<br><font size=+1>UI Reference</font><br>
|
||||
<a href="docs/MOH GUI Documentation.html">MOH GUI Documentation</a><br>
|
||||
<a href="docs/MOH_ClientClasses.html">MOH Client Classes</a><br>
|
||||
<br><font size=+1>Client/Special Effects Reference</font><br>
|
||||
<a href="docs/MOH_Client_Side_Reference.html">MOH Client Side Reference</a><br>
|
||||
<a href="docs/MOH particles.html">MOH Particles</a><br>
|
||||
<a href="docs/MOH_ClientGameClasses.html">MOH Client Game Classes</a><br>
|
||||
<br><font size=+1>General Reference</font><br>
|
||||
<a href="docs/MOH Radiant Feature.html">MOH Radiant Features</a><br>
|
||||
<a href="docs/MOH Terrain Editing Manual.html">MOH Terrain Editing Manual</a><br>
|
||||
<a href="docs/MOH_design_faq.html">MOH Design FAQ</a><br>
|
||||
</p>
|
||||
|
||||
<br>
|
||||
<I><B><u><font size=+1>Tutorials</font></u></b></I>
|
||||
<br>
|
||||
<p>
|
||||
<a href="tutorials/AI tutorial.html">AI Tutorial</a><br>
|
||||
<a href="tutorials/Creating Collision for a Static Mesh.htm">Creating Collision for a Static Mesh</a><br>
|
||||
<a href="tutorials/decal_tutorial.html">Decal Tutorial</a><br>
|
||||
<a href="tutorials/driving_tutorial1.html">Driving Tutorial 1</a><br>
|
||||
<a href="tutorials/driving_tutorial2.html">Driving Tutorial 2</a><br>
|
||||
<a href="tutorials/exploder_tutorial.html">Exploder Tutorial</a><br>
|
||||
<a href="tutorials/manvis_tutorial.html">ManVis Tutorial</a><br>
|
||||
<a href="tutorials/riding_tutorial.html">Riding Tutorial</a><br>
|
||||
<a href="tutorials/TOW_tutorial.html">TOW Tutorial</a><br>
|
||||
</p>
|
||||
|
||||
</body>
|
||||
|
||||
|
||||
|
||||
<p>
|
||||
|
||||
</p>
|
||||
|
||||
|
||||
|
||||
<pre>
|
||||
<i><font color=blue>
|
||||
|
||||
</font>
|
||||
</i>
|
||||
</pre>
|
23
license.txt
Normal file
|
@ -0,0 +1,23 @@
|
|||
EA TOOLS END USER LICENSE
|
||||
|
||||
Electronic Arts Inc, and its subsidiaries, affiliates and licensors (collectively, "EA") grants you a non- transferable license to download and use one copy of the software tool ("Tool"), other materials accompanying the tool, and the materials created with the tool (collectively the "Tools & Materials") solely for your personal noncommercial use in connection with EA products.
|
||||
|
||||
EA and its Licensors own all of the rights in the Tools & Materials. You may not alter any of EA’s trademarks or logos, or alter or remove any of EA’s or its Licensor’s trademark or copyright notices included in or with the Tools & Materials. Your right to use Tools & Materials is limited to the license grant above, and you may not otherwise copy, display, distribute, perform, publish, modify, or use any of the Tools & Materials. Without limiting the preceding sentence, you may not modify, reverse engineer, disassemble, license, transfer, distribute, create derivative works from, or sell the Tool, or use the Tools & Materials to further any commercial or unlawful purpose. Without limiting the foregoing, you may not use the Tools & Materials to sell advertising, to promote another product or business, or on any site that operates or promotes a server emulator.
|
||||
|
||||
THESE TOOLS ARE PROVIDED "AS IS" WITHOUT ANY WARRANTIES OF ANY KIND, EXPRESS OR IMPLIED. EA SPECIFICALLY DISCLAIMS ANY WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY AND NONINFRINGEMENT.
|
||||
|
||||
ANY USE YOU CHOOSE TO MAKE OF THESE TOOLS IS UNDERTAKEN BY YOU ENTIRELY AT YOUR OWN RISK. EA DOES NOT WARRANT THAT THESE TOOLS WILL NOT CAUSE DAMAGE TO YOUR COMPUTER SYSTEM, NETWORK, SOFTWARE OR OTHER TECHNOLOGY.
|
||||
|
||||
EA WILL NOT PROVIDE SUPPORT IN ANY MANNER OR ANSWER ANY QUESTIONS REGARDING THESE TOOLS. PLEASE DO NOT CALL OR SEND EMAIL TO EA CUSTOMER SUPPORT REGARDING THESE TOOLS, AS EA WILL NOT BE ABLE TO ANSWER THESE INQUIRIES.
|
||||
|
||||
IN NO EVENT SHALL EA BE LIABLE FOR ANY DIRECT, CONSEQUENTIAL, INCIDENTAL, SPECIAL, PUNITIVE OR OTHER DAMAGES WHATSOEVER (INCLUDING WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, OR LOSS OF BUSINESS INFORMATION), EVEN IF EA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
EA RESERVES THE RIGHT TO DISCONTINUE THE AVAILABILITY OF THESE TOOLS, OR MODIFY THEM, AT ANY TIME, WITH NO OBLIGATION TO ANYONE.
|
||||
|
||||
At EA’s request, you agree to defend, indemnify and hold harmless EA from all liabilities, claims and expenses, including attorneys’ fees, arising from any breach of this License by you and/or your use or misuse of the Tools & Materials.
|
||||
|
||||
EA may make the Tools & Materials available at its site(s) located in the United States and/or Canada and/or the European Union. You are solely responsible for knowing and complying with all federal, state, and local laws that may apply to your use of Tools & Materials in your own locale. By downloading any Tools & Materials, you warrant that you are not located in any country, or exporting the Tools & Materials to any person or place, to which the United States and/or Canada and/or European Union or its member countries has embargoed goods.
|
||||
|
||||
EA may terminate this License at any time. Upon termination, you must destroy or return to EA all Tools & Materials. This License is governed by United States Copyright and California law (without regard to conflicts of law), and is the entire agreement between EA and you regarding the Tools & Materials.
|
||||
|
||||
|
62135
maps/MP_Berlin_TOW.map
Normal file
1093
maps/MP_Berlin_TOW.scr
Normal file
801
maps/T2L1_Tank.scr
Normal file
|
@ -0,0 +1,801 @@
|
|||
//--------------------------------------------------------------------------------
|
||||
// T2L1_Tank.Scr
|
||||
// Jeff Leggett
|
||||
// 07/08/2002
|
||||
//
|
||||
// Handles the custom tanks in T2L1...
|
||||
//
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
main:
|
||||
//
|
||||
// Initialization function...
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
$tigertank1 hide
|
||||
//$tigertank1_stickybomb hide
|
||||
//level.bStickyBombHidden = 1
|
||||
level.bTigerTank1Destroyed = 0
|
||||
|
||||
level.friendly3 thread MedicThink
|
||||
|
||||
End
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
DoTank1:
|
||||
//
|
||||
// Tigertank1 - starts the TigerTank rolling on its path
|
||||
//
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
dprintln "Starting up tank1!!"
|
||||
|
||||
$tigertank1 thread Tank1Go
|
||||
|
||||
// set these as 1 until ready... Makes sure these guys are alive for the gag.
|
||||
level.bTreeGuyReady = 0
|
||||
level.bDialogSpoken = 0
|
||||
|
||||
End
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
Tank1Go:
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
level.enemytankspeed = 200
|
||||
level.playertanktarget = $player
|
||||
level.lookahead = 256
|
||||
level.sightdistance = 16000
|
||||
self setcollisionentity $panzertank_mask
|
||||
// self.type = NIL
|
||||
self rendereffects "-shadow"
|
||||
self.start_health = 1000
|
||||
self.health = self.start_health
|
||||
self removeondeath 0
|
||||
self immune bullet
|
||||
self immune fast_bullet
|
||||
self immune grenade
|
||||
self immune bash
|
||||
|
||||
self.bAttackPlayer = 1
|
||||
|
||||
thread SetupFriendlies
|
||||
|
||||
self.gun = self QueryTurretSlotEntity 0
|
||||
|
||||
thread global/ai.scr::spawn 6
|
||||
self show
|
||||
|
||||
level.friendly1.health_pickup = FALSE
|
||||
level.friendly2.health_pickup = FALSE
|
||||
level.friendly3.health_pickup = FALSE
|
||||
|
||||
// Run the vehicle_warning script
|
||||
//self thread global/Vehicle_Warning.Scr::WarnFriendlies $friendly 800 0.707
|
||||
//self.previous_thread = parm.previousthread
|
||||
|
||||
// MJG: the following construct is undefined and BAD BAD BAD
|
||||
// self waittill (level.bDialogueSpoken == 1)
|
||||
while ( level.bDialogSpoken != 1 )
|
||||
{
|
||||
// don't start driving until dialog is spoken?
|
||||
waitframe
|
||||
}
|
||||
|
||||
self drive $tigertank1_path level.enemytankspeed 30 200 level.lookahead
|
||||
// self.gun setAimTarget $player
|
||||
self waittill drive
|
||||
self stop
|
||||
|
||||
// okay, we're here. Now aim at the friendlies...
|
||||
|
||||
if ( level.friendly3!=NULL && isAlive level.friendly3 )
|
||||
{
|
||||
// MJG: the following construct is undefined and BAD BAD BAD
|
||||
// self waittill (level.bTreeGuyReady == 1)
|
||||
|
||||
while ( level.bTreeGuyReady != 1 )
|
||||
{
|
||||
waitframe
|
||||
}
|
||||
|
||||
// stop attacking player
|
||||
self.bAttackPlayer = 0
|
||||
|
||||
if ( isAlive self )
|
||||
self waitthread target_delay_fire level.friendly3 3
|
||||
|
||||
wait 0.1
|
||||
|
||||
// jsl--> Make sure he DIES!
|
||||
if ( isAlive self && isAlive level.friendly3 )
|
||||
{
|
||||
level.friendly3 damage self 3000 self (0 0 0) (0 0 0) (0 0 0) 0 9 0 0
|
||||
}
|
||||
wait 0.5
|
||||
}
|
||||
|
||||
if ( level.friendly2!=NULL && isAlive level.friendly2 )
|
||||
{
|
||||
self.bAttackPlayer = 0
|
||||
|
||||
self.gun setAimTarget level.friendly2
|
||||
|
||||
// do our miss....
|
||||
wait 3
|
||||
thread DoFriendly2RunAway
|
||||
wait 1
|
||||
if ( isAlive self )
|
||||
self waitthread target_delay_fire NULL 1
|
||||
wait 0.1
|
||||
|
||||
// this time we hit him!
|
||||
if ( isAlive self )
|
||||
self.gun setAimTarget level.friendly2
|
||||
|
||||
wait 4
|
||||
|
||||
if ( isAlive self )
|
||||
self waitthread target_waittill_fire level.friendly2
|
||||
|
||||
// jsl--> hack until tank aiming is fixed.
|
||||
if ( isAlive self && isAlive level.friendly2 )
|
||||
{
|
||||
level.friendly2 damage self 3000 self (0 0 0) (0 0 0) (0 0 0) 0 9 0 0
|
||||
}
|
||||
wait 0.5
|
||||
}
|
||||
|
||||
if ( level.friendly1!=NULL && isAlive level.friendly1 )
|
||||
{
|
||||
self.bAttackPlayer = 0
|
||||
|
||||
if ( isAlive self )
|
||||
self.gun setAimTarget level.friendly1
|
||||
wait 2
|
||||
thread DoFriendly1RunAway
|
||||
if ( isAlive self )
|
||||
self waitthread target_delay_fire NULL 1
|
||||
wait 0.1
|
||||
|
||||
if ( isAlive self )
|
||||
self.gun setAimTarget level.friendly1
|
||||
wait 6
|
||||
|
||||
if ( isAlive self )
|
||||
self waitthread target_waittill_fire level.friendly1
|
||||
|
||||
// jsl--> hack until tank aiming is fixed.
|
||||
if ( isAlive self && isAlive level.friendly1 )
|
||||
{
|
||||
level.friendly1 damage self 3000 self (0 0 0) (0 0 0) (0 0 0) 0 9 0 0
|
||||
}
|
||||
wait 0.5
|
||||
}
|
||||
|
||||
// now just be a normal tank... (ie: go after player...)
|
||||
if ( isAlive self )
|
||||
{
|
||||
self thread maps/t2l1.scr::tank_think 0 //panzer //_winter
|
||||
self thread maps/t2l1.scr::tank_targeting
|
||||
}
|
||||
|
||||
// put the survivors back to their old health value...
|
||||
if ( level.friendly1!=NIL && isAlive level.friendly1 )
|
||||
level.friendly1 thread RestoreHealth
|
||||
if ( level.friendly2!=NIL && isAlive level.friendly2 )
|
||||
level.friendly2 thread RestoreHealth
|
||||
if ( level.friendly3!=NIL && isAlive level.friendly3 )
|
||||
level.friendly3 thread RestoreHealth
|
||||
|
||||
End
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
//--------------------------------------------------------------------------------
|
||||
target_delay_fire local.targ local.delay:
|
||||
|
||||
if ( isAlive self )
|
||||
self.gun setAimTarget local.targ
|
||||
wait local.delay
|
||||
if ( isAlive self )
|
||||
self.gun anim fire
|
||||
|
||||
end
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
//--------------------------------------------------------------------------------
|
||||
target_waittill_fire local.targ:
|
||||
|
||||
if ( isAlive self )
|
||||
{
|
||||
self.gun setAimTarget local.targ
|
||||
self.gun waittill ontarget
|
||||
}
|
||||
if ( isAlive self )
|
||||
self.gun anim fire
|
||||
|
||||
end
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
GoAfterPlayer:
|
||||
//
|
||||
// Go after player when the mg42 guy dies. Stop going after player when
|
||||
//
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
while ( self.bAttackPlayer==1 )
|
||||
{
|
||||
self.gun setAimTarget $player
|
||||
self.gun waittill ontarget
|
||||
|
||||
if (self == NULL)
|
||||
end
|
||||
|
||||
// should probably be targeting the player or something...
|
||||
if !(vector_within $player.origin self.origin 16000)
|
||||
{
|
||||
wait 1
|
||||
}
|
||||
else if (!(sighttrace $player.origin (self.gun.origin + (0 0 64)) 1))
|
||||
{
|
||||
wait 1
|
||||
}
|
||||
else
|
||||
{
|
||||
wait 3
|
||||
if ( self.bAttackPlayer==1 )
|
||||
{
|
||||
self.gun setAimTarget $player
|
||||
self.gun waittill ontarget
|
||||
|
||||
if (self == NULL)
|
||||
end
|
||||
|
||||
////this causes the bug where the cannon doesnt shoot in the Z direction... self.gun setAimTarget NULL
|
||||
self.gun anim fire
|
||||
wait 2
|
||||
}
|
||||
}
|
||||
|
||||
if (self == NULL)
|
||||
end
|
||||
}
|
||||
|
||||
|
||||
End
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
DoFriendly2RunAway:
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
if ( level.bTigerTank1Destroyed==0 )
|
||||
{
|
||||
level.attackthread2 delete
|
||||
level.friendly2 thread Friendly2RunAway
|
||||
level.attackthread2 = parm.previousthread
|
||||
}
|
||||
|
||||
End
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
DoFriendly1RunAway:
|
||||
//
|
||||
//
|
||||
// he runs his flee path and will attack from there....
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
if ( level.bTigerTank1Destroyed==0 )
|
||||
{
|
||||
level.attackthread1 delete
|
||||
|
||||
level.friendly1 thread FriendlyAttackTank $friendly1_fleepath 1
|
||||
level.attackthread1 = parm.previousthread
|
||||
}
|
||||
|
||||
End
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
Friendly2RunAway:
|
||||
//
|
||||
// Friendly runs away from tank...
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
self runto $friendly2_fleepath
|
||||
self waittill movedone
|
||||
|
||||
if ( parm.movedone!=1 )
|
||||
goto Friendly2RunAway
|
||||
|
||||
// do cower here..
|
||||
while ( 1 )
|
||||
{
|
||||
self anim 23A107_TakeCoverP
|
||||
self waittill animdone
|
||||
}
|
||||
|
||||
End
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
BeHealthy:
|
||||
// temporarily crank up our health to do the tank gag...
|
||||
//--------------------------------------------------------------------------------
|
||||
if ( self==NIL )
|
||||
end
|
||||
|
||||
if ( isAlive self )
|
||||
{
|
||||
self.save_health = self.health
|
||||
self.health = self.maxhealth * 0.75
|
||||
}
|
||||
end
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
RestoreHealth:
|
||||
//
|
||||
// put our health back where it was before the tank gag...
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
if ( self==NIL )
|
||||
end
|
||||
|
||||
if ( isAlive self )
|
||||
{
|
||||
self.health = self.save_health
|
||||
}
|
||||
end
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
SetupFriendlies:
|
||||
// Go to our hiding places and do the player dialog...
|
||||
//
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
wait 2
|
||||
|
||||
if ( level.friendly1!=NIL && isAlive level.friendly1 )
|
||||
{
|
||||
level.friendly1 thread BeHealthy
|
||||
// level.friendly1 thread FriendlyAttackTank $friendly1_rally 1
|
||||
// level.attackthread1 = parm.previousthread
|
||||
level.friendly1 thread DoTank1Dialog
|
||||
|
||||
level.friendly2 thread FriendlyAttackTank $friendly2_rally 1
|
||||
level.attackthread2 = parm.previousthread
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( level.friendly2!=NIL && isAlive level.friendly2 )
|
||||
{
|
||||
level.friendly2 thread DoTank1Dialog
|
||||
level.friendly2 thread BeHealthy
|
||||
}
|
||||
}
|
||||
|
||||
if ( level.friendly3!=NIL && isAlive level.friendly3 )
|
||||
{
|
||||
level.friendly3.abort_cover = 1
|
||||
level.friendly3 thread BeHealthy
|
||||
// make sure he dies the right way...
|
||||
level.friendly3 exec global/setdeathanim.scr "21A201_RagDollDeath"
|
||||
// run to his spot...
|
||||
level.friendly3 thread FriendlyAttackTank $friendly3_rally 0
|
||||
level.attackthread3 = parm.previousthread
|
||||
}
|
||||
|
||||
if (!(isAlive level.friendly1) && !(isAlive level.friendly2))
|
||||
{
|
||||
dprintln "both are dead, start the tank"
|
||||
level.bDialogSpoken = 1
|
||||
}
|
||||
End
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
Tank1Dead:
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
level.bTigerTank1Destroyed = 1
|
||||
|
||||
// kill the friendly threads....
|
||||
level.attackthread1 delete
|
||||
level.attackthread2 delete
|
||||
level.attackthread3 delete
|
||||
|
||||
// become friends with player again...
|
||||
if (level.friendly1 && isAlive level.friendly1 )
|
||||
{
|
||||
level.friendly1 thread FriendStart
|
||||
level.friendly1 exec global/enable_ai.scr
|
||||
}
|
||||
|
||||
if (level.friendly2 && isAlive level.friendly2 )
|
||||
{
|
||||
level.friendly2 thread FriendStart
|
||||
level.friendly2 exec global/enable_ai.scr
|
||||
}
|
||||
|
||||
if (level.friendly3 && isAlive level.friendly3 )
|
||||
{
|
||||
level.friendly3 thread FriendStart
|
||||
level.friendly3.abort_cover = 0
|
||||
|
||||
// level.friendly3 exec global/enable_ai.scr
|
||||
}
|
||||
|
||||
End
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
TankDialogDeathCheck:
|
||||
//
|
||||
// if the guy dies before saying his dialog, make sure the game can go on...
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
self waittill death
|
||||
|
||||
level.bDialogSpoken = 1
|
||||
|
||||
//if ( level.bStickyBombHidden==0 )
|
||||
//{
|
||||
//End
|
||||
//}
|
||||
|
||||
//waitthread ShowStickyBomb
|
||||
exec global/obj.scr 3 current "Use Sticky Bomb to Destroy Tank" $tigertank1.origin
|
||||
End
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
ShowStickyBomb:
|
||||
//--------------------------------------------------------------------------------
|
||||
if ( level.bStickyBombHidden==1 )
|
||||
{
|
||||
level.bStickyBombHidden = 0
|
||||
exec global/obj.scr 3 current "Use Sticky Bomb to Destroy Tank" $tigertank1.origin
|
||||
}
|
||||
|
||||
End
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
DoTank1Dialog:
|
||||
//
|
||||
// say our dialog and run to our spot...
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
level.bDialogSpoken = 0
|
||||
|
||||
self thread FriendStop
|
||||
|
||||
//self thread TankDialogDeathCheck
|
||||
|
||||
self exec global/disable_ai.scr
|
||||
self nodamage
|
||||
self runto $friendly1_speechnode.origin
|
||||
self waittill movedone
|
||||
level.bDialogSpoken = 1
|
||||
wait 3
|
||||
self anim 21A103_Dialogue3
|
||||
self waittill animdone
|
||||
self takedamage
|
||||
self exec global/enable_ai.scr
|
||||
|
||||
exec global/obj.scr 3 current "Use Sticky Bomb to Destroy Tank" $tigertank1.origin
|
||||
|
||||
if ( self==level.friendly1 )
|
||||
{
|
||||
self thread FriendlyAttackTank $friendly1_rally 1
|
||||
level.attackthread1 = parm.previousthread
|
||||
}
|
||||
else if ( self==level.friendly2 )
|
||||
{
|
||||
self thread FriendlyAttackTank $friendly2_rally 1
|
||||
level.attackthread2 = parm.previousthread
|
||||
}
|
||||
End
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
FriendlyAttackTank local.dest local.attack:
|
||||
//
|
||||
// Sets up this friendly to run to the dest and start attacking the tank...
|
||||
//
|
||||
//--------------------------------------------------------------------------------
|
||||
self waitthread FriendStop
|
||||
|
||||
self exec global/disable_ai.scr
|
||||
|
||||
local.there = 0
|
||||
|
||||
while ( local.there==0 )
|
||||
{
|
||||
self runto local.dest
|
||||
self waittill movedone
|
||||
if ( parm.movedone==1 )
|
||||
local.there = 1
|
||||
}
|
||||
|
||||
self turnto $tigertank1
|
||||
|
||||
if ( local.attack==1 )
|
||||
{
|
||||
self aimat $tigertank1
|
||||
|
||||
wait 0.2
|
||||
|
||||
self exec global/crouch.scr
|
||||
|
||||
// now start doing cover fire...
|
||||
|
||||
while ( isAlive self )
|
||||
{
|
||||
// note: this thread gets deleted when the tank dies...
|
||||
|
||||
// if we have a shot at him, do it...
|
||||
|
||||
if (sighttrace (self.origin + (0 0 64)) $tigertank1.origin 1)
|
||||
{
|
||||
for (local.xx = 0; local.xx < 8; local.xx++ )
|
||||
{
|
||||
if ( !(isAlive self) )
|
||||
break
|
||||
|
||||
self fire
|
||||
wait 0.6
|
||||
|
||||
self turnto $tigertank1
|
||||
self aimat $tigertank1
|
||||
}
|
||||
}
|
||||
// ??? self waitthread anim/reload.scr::Reload 1 1 0
|
||||
// reloading...
|
||||
wait 3
|
||||
|
||||
self turnto $tigertank1
|
||||
self aimat $tigertank1
|
||||
}
|
||||
}
|
||||
else if (self==level.friendly3)
|
||||
{
|
||||
// tell tank to come and get me...
|
||||
level.bTreeGuyReady = 1
|
||||
|
||||
while ( isAlive self )
|
||||
{
|
||||
self anim 23A107_TakeCoverP
|
||||
self waittill animdone
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
End
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
FriendStart:
|
||||
//
|
||||
// Become a friend...
|
||||
//-------------------------------------------------------------------
|
||||
|
||||
self.mins = 0
|
||||
self.maxs = 30
|
||||
// self.destination = $player
|
||||
self.friendtype = 1
|
||||
|
||||
// friendly3 is the medic...
|
||||
if ( self==level.friendly3 )
|
||||
self.friendtype = 5
|
||||
|
||||
self thread global/friendly.scr::friendlythink
|
||||
End
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
FriendStop:
|
||||
//--------------------------------------------------------------------------------
|
||||
self thread global/friendly.scr::friendlystop
|
||||
|
||||
End
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
mg42_guy_death_check:
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
self waittill death
|
||||
|
||||
// now that the mg42 guy is dead... Have the turret go after the player...
|
||||
$tigertank1 thread GoAfterPlayer
|
||||
|
||||
end
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
MedicRunForCover:
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
// find closest cover place and run there...
|
||||
local.total = $medic_hideplace.size
|
||||
local.min_dist = 999999
|
||||
local.min_node = NULL
|
||||
|
||||
for (local.i=1;local.i<=$medic_hideplace.size;local.i++)
|
||||
{
|
||||
local.dist = vector_length ( self.origin - $medic_hideplace[local.i].origin )
|
||||
|
||||
if ( local.dist < local.min_dist )
|
||||
{
|
||||
local.min_dist = local.dist
|
||||
local.min_node = $medic_hideplace[local.i]
|
||||
}
|
||||
}
|
||||
|
||||
if ( local.min_node!=NULL )
|
||||
{
|
||||
// we found one... how far?
|
||||
if ( local.min_dist >= 2304 )
|
||||
{
|
||||
dprintln "Found medic_hideplace node, but it's too far:" local.min_dist
|
||||
}
|
||||
else
|
||||
{
|
||||
dprintln "Found medic_hideplace node, running there now!"
|
||||
local.done = 0
|
||||
self runto local.min_node
|
||||
self waittill movedone
|
||||
|
||||
if ( self.abort_cover==0 )
|
||||
self exec global/crouch.scr
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
dprintln "No medic_hideplace nodes. No where to run!"
|
||||
}
|
||||
|
||||
|
||||
end
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
AreFriendliesFighting:
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
local.bFighting = 0
|
||||
|
||||
if ( isAlive level.friendly1 && level.friendly1.has_enemy==1 )
|
||||
local.bFighting = 1
|
||||
|
||||
if ( isAlive level.friendly2 && level.friendly2.has_enemy==1 )
|
||||
local.bFighting = 1
|
||||
|
||||
end local.bFighting
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
WaitForFightingToStop:
|
||||
//
|
||||
// wait for fighting to stop while monitoring everyone's health. If anyones
|
||||
// health goes too low, turn back into our friendly medic...
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
local.bFighting = 1
|
||||
local.bTurnedOnMedic = 0
|
||||
|
||||
while ( local.bFighting==1 && self.abort_cover==0 )
|
||||
{
|
||||
wait 0.5
|
||||
local.bFighting = waitthread AreFriendliesFighting
|
||||
|
||||
if ( local.bFighting==1 )
|
||||
{
|
||||
// still fighting, see if anyone needs a medic...
|
||||
|
||||
local.bNeedMedic = 0
|
||||
|
||||
local.health = ($player.health * 100) / $player.maxhealth
|
||||
if (local.health < level.medicmin)
|
||||
local.bNeedMedic = 1
|
||||
|
||||
if ( isAlive level.friendly1 )
|
||||
{
|
||||
local.health = (level.friendly1.health * 100) / level.friendly1.maxhealth
|
||||
if (local.health < level.medicmin)
|
||||
local.bNeedMedic = 1
|
||||
}
|
||||
|
||||
if ( isAlive level.friendly2 )
|
||||
{
|
||||
local.health = (level.friendly2.health * 100) / level.friendly2.maxhealth
|
||||
if (local.health < level.medicmin)
|
||||
local.bNeedMedic = 1
|
||||
}
|
||||
|
||||
if ( local.bTurnedOnMedic==0 )
|
||||
{
|
||||
if ( local.bNeedMedic==1 )
|
||||
{
|
||||
dprintln "someone needs a medic... Going back into medic-mode...."
|
||||
local.bTurnedOnMedic = 1
|
||||
if ( self.abort_cover==0 )
|
||||
self thread global/friendly.scr::friendlythink
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// we're still fighting, we've turned on medic mode again, but no one needs us. Run for cover!
|
||||
if ( local.bNeedMedic==0 )
|
||||
{
|
||||
local.bTurnedOnMedic = 0
|
||||
self waitthread global/friendly.scr::friendlystop
|
||||
|
||||
// no one needs a medic, therefore run to hiding spot again...
|
||||
dprintln "OK, everyone healed.. Medic running for cover again..."
|
||||
self waitthread MedicRunForCover
|
||||
wait 3
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
end
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
MedicThink:
|
||||
//
|
||||
// Have medic run for cover whenever his buddies
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
self.abort_cover = 0
|
||||
|
||||
// Have our buddies monitor if they're attacking or not...
|
||||
level.friendly1 thread FriendlyEnemyCheck
|
||||
level.friendly2 thread FriendlyEnemyCheck
|
||||
|
||||
while ( isAlive self )
|
||||
{
|
||||
local.bFighting = waitthread AreFriendliesFighting
|
||||
|
||||
if ( local.bFighting==1 && self.abort_cover==0 )
|
||||
{
|
||||
dprintln "FRIENDS ARE FIGHTING! --> Medic running for cover.."
|
||||
// stop being a friend for now... Go run for cover...
|
||||
self waitthread global/friendly.scr::friendlystop
|
||||
self waitthread MedicRunForCover
|
||||
|
||||
// we've run for cover, now see when the fighting is over...
|
||||
self waitthread WaitForFightingToStop
|
||||
|
||||
dprintln "FRIENDS have stopped fighting! Becoming a medic again..."
|
||||
|
||||
// fighting has stopped, therefore turn our friendlyness back on..
|
||||
if( self.abort_cover==0 )
|
||||
self thread global/friendly.scr::friendlythink
|
||||
}
|
||||
|
||||
wait 0.5
|
||||
}
|
||||
|
||||
|
||||
end
|
||||
//--------------------------------------------------------------------------------
|
||||
FriendlyEnemyCheck:
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
while ( isAlive self )
|
||||
{
|
||||
self.has_enemy = 0
|
||||
self waittill hasenemy
|
||||
self.has_enemy = 1
|
||||
while ( isAlive self && self.has_enemy==1 )
|
||||
{
|
||||
wait 3
|
||||
if ( self!=NULL && self.thinkstate != "attack" )
|
||||
{
|
||||
wait 1
|
||||
if ( self!=NULL && self.thinkstate != "attack" )
|
||||
self.has_enemy = 0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
self.hasenemy = 0
|
||||
|
||||
end
|
BIN
maps/mp_berlin_tow.dcl
Normal file
BIN
maps/t2l1.dcl
Normal file
121125
maps/t2l1.map
Normal file
2126
maps/t2l1.scr
Normal file
115
maps/t2l1_explosion.scr
Normal file
|
@ -0,0 +1,115 @@
|
|||
// --------------------------------------------------------------------------------
|
||||
// T2L1_Explosion.Scr
|
||||
//
|
||||
// 1. Handles the fuel-tank explosion. Blows up the fuel tank, the nebelwerfer,
|
||||
// and the nebelwerfer soldier.
|
||||
// Add the following as your setthread on the fuel tank damage trigger.
|
||||
//
|
||||
// 2. Handles the crashing supply truck.
|
||||
//
|
||||
//
|
||||
// note: exec this script after the waittill spawn command...
|
||||
//
|
||||
// --------------------------------------------------------------------------------
|
||||
|
||||
// --------------------------------------------------------------------------------
|
||||
main:
|
||||
//
|
||||
//
|
||||
// Do initialization here...
|
||||
// --------------------------------------------------------------------------------
|
||||
|
||||
$fuel_tank_mask thread fuel_tank_death
|
||||
|
||||
// Tweak these numbers when the truck animation is final...
|
||||
level.nTreeDeathWaitTime = 4
|
||||
level.nCrashTruckSpawnTime = 5
|
||||
|
||||
End
|
||||
|
||||
|
||||
|
||||
// --------------------------------------------------------------------------------
|
||||
fuel_tank_death:
|
||||
//
|
||||
// Scripting pertaining to the destroyable fuel tank depot area halfway up the road
|
||||
//
|
||||
// fuel_tank_death - waits until health is zero, spawns an explosion,
|
||||
// swaps models, updates objectives, then starts the Tiger Tank
|
||||
// --------------------------------------------------------------------------------
|
||||
self waittill damage
|
||||
|
||||
if ( $fuel_tank_mask.health > 0)
|
||||
goto fuel_tank_death
|
||||
|
||||
self remove
|
||||
|
||||
exec global/model.scr $fuel_tank_explosion.origin $fuel_tank_explosion.model
|
||||
|
||||
// 1500 pts of damage 25 foot radius... (16*25==400)
|
||||
|
||||
$nebel2.health = 20000
|
||||
|
||||
// jsl-->must wait this fraction of a second to prevent a crash...
|
||||
wait 0.1
|
||||
radiusdamage $fuel_tank_explosion.origin 1500 400
|
||||
exec global/model.scr $fuel_tank_explosion.origin "emitters/mortar_higgins.tik"
|
||||
exec global/earthquake.scr .2 4 0 0
|
||||
|
||||
$fuel_tank remove
|
||||
$fuel_tank_destroyed show
|
||||
|
||||
$nebelwerfer2 TurnOff
|
||||
|
||||
// destroy the nebelwerfer...
|
||||
wait 0.25
|
||||
|
||||
if ( $nebel2_throbbox != NIL )
|
||||
$nebel2_throbbox blowup
|
||||
|
||||
// kill the nebelwerfer operator...
|
||||
if ( isAlive $nebeller2 )
|
||||
$nebeller2 damage $player 15000 $world (0 0 0) (0 0 0) (0 0 0) 0 9 0 0
|
||||
|
||||
end
|
||||
|
||||
|
||||
// --------------------------------------------------------------------------------
|
||||
DoCrashingTruck:
|
||||
//
|
||||
// Play the crashing truck animation.
|
||||
// Spawn the guys out of the truck....
|
||||
// --------------------------------------------------------------------------------
|
||||
//$crashing_truck waitthread CrashTruck
|
||||
thread DestroyTree
|
||||
$crashing_truck notsolid
|
||||
$crashing_truck_mask solid
|
||||
wait level.nCrashTruckSpawnTime
|
||||
// Time to spawn...
|
||||
thread global/ai.scr::spawn 17
|
||||
|
||||
End
|
||||
|
||||
// --------------------------------------------------------------------------------
|
||||
CrashTruck:
|
||||
//
|
||||
// Play the trucks crash animation and wait until it's done...
|
||||
// --------------------------------------------------------------------------------
|
||||
thread DestroyTree
|
||||
//self moveanim 21p300_truckcrash
|
||||
//self waittill animdone
|
||||
|
||||
self stop
|
||||
|
||||
End
|
||||
|
||||
// --------------------------------------------------------------------------------
|
||||
DestroyTree:
|
||||
// --------------------------------------------------------------------------------
|
||||
wait level.nTreeDeathWaitTime
|
||||
// radiusdamage $crashing_truck_tree.origin 200 600
|
||||
$crashing_truck_tree damage $world 15000 $world (0 0 0) (0 0 0) (0 0 0) 0 0 9 0
|
||||
wait 2.0
|
||||
$crashing_truck_tree killed $world 15000 $world (0 0 0) (0 0 0) (0 0 0) 0 0 9 0
|
||||
|
||||
End
|
220
maps/t2l1_tank_mgsoldier.scr
Normal file
|
@ -0,0 +1,220 @@
|
|||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
//
|
||||
// gags/t2l1_tank_mgsoldier.scr
|
||||
//
|
||||
// when you want the soldier to spawn from the tank,
|
||||
// run the mgsoldier_spawn thread on the tank object as follows:
|
||||
//
|
||||
// $tank thread gags/t2l1_tank_mgsoldier.scr::mgsoldier_spawn
|
||||
//
|
||||
// everything from that point on is handled in this script
|
||||
//
|
||||
// TODO:
|
||||
// - verify all functionality with new panzer asset, including:
|
||||
// - proper soldier position & attachment
|
||||
// - add audio for talk below animation?
|
||||
//
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
main:
|
||||
end
|
||||
|
||||
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
//
|
||||
// 21G301_OpenHatch
|
||||
// 21G302_Pause
|
||||
// 21G303_Fire
|
||||
// 21G304_TalkBelow
|
||||
// 21G305_Death
|
||||
// 21G306_DeathL
|
||||
//
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
// this thread runs on the tank when the soldier is to spawn
|
||||
//
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
mgsoldier_spawn:
|
||||
|
||||
//// dprintln "~~~~~~~~~~~~~~~~~~~~~~~~~~~~ mgsoldier_spawn"
|
||||
|
||||
local.turret = self queryturretslotentity 0
|
||||
|
||||
// <TWEAK> this is the soldier to spawn
|
||||
local.spawnsoldier = human/german_winter_Artillery-Crew
|
||||
|
||||
|
||||
// spawn and position the soldier
|
||||
local.ent = spawn local.spawnsoldier
|
||||
local.ent.origin = local.turret gettagposition "tag_start"
|
||||
local.ent.angles = local.turret gettagangles "tag_start"
|
||||
|
||||
local.ent thread gags/t2l1_Tank.scr::mg42_guy_death_check
|
||||
|
||||
|
||||
// attach the soldier to the turret
|
||||
local.ent physics_off
|
||||
local.ent attach local.turret "tag_start" 0
|
||||
|
||||
// configure the soldier (copied from vehicle_thinkers -- dunno if appropriate)
|
||||
local.ent noticescale 1
|
||||
local.ent sight 4500
|
||||
local.ent mindist 2024
|
||||
local.ent maxdist 2448
|
||||
local.ent leash 10000
|
||||
local.ent.accuracy = 10
|
||||
|
||||
// give the soldier an MP40
|
||||
local.ent gun MP40
|
||||
|
||||
// turn off the ai
|
||||
local.ent exec global/disable_ai.scr
|
||||
|
||||
// turn off collision, so the opening animation plays uninterrupted
|
||||
local.ent notsolid
|
||||
|
||||
// animate the turret hatch opening
|
||||
local.turret anim open
|
||||
//local.turret waittill animdone
|
||||
wait 0.5
|
||||
|
||||
// play the soldier hatch opening animation
|
||||
local.ent anim_noclip 21G301_OpenHatch
|
||||
// dprintln "soldier gag - did it get this far1?"
|
||||
local.ent waittill animdone
|
||||
// dprintln "soldier gag - did it get this far2?"
|
||||
// turn collision back on
|
||||
|
||||
local.ent shootableonly
|
||||
local.ent solid
|
||||
local.ent dontdropweapons
|
||||
|
||||
local.ent thread soldier_tank_attack local.turret
|
||||
|
||||
end
|
||||
|
||||
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
// this thread runs on the spawned soldier
|
||||
//
|
||||
// it controls the animation of the soldier
|
||||
// according to the animation state chart
|
||||
//
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
soldier_tank_attack local.turret:
|
||||
|
||||
local.lastaction = 0
|
||||
local.attackcount = 0
|
||||
|
||||
// start the thread that monitors the gunfire
|
||||
level.tanksoldierusemg = 0
|
||||
self thread soldier_tank_attack_firemg
|
||||
|
||||
// override the normal death anim
|
||||
self.deathanim = 21G305_Death
|
||||
|
||||
while ( isAlive self )
|
||||
{
|
||||
// <TWEAK> randomize and play animations based on state chart
|
||||
local.rnd = randomint( 100 )
|
||||
if ( (local.rnd < 60) && (local.attackcount > 1) )
|
||||
{
|
||||
// prevent repeated firing
|
||||
local.rnd = 61
|
||||
}
|
||||
if ( local.rnd < 60 )
|
||||
{
|
||||
// attack 60%
|
||||
local.lastaction = 1
|
||||
local.attackcount++
|
||||
self turnto $player
|
||||
|
||||
// <TWEAK> select random aim and fire times
|
||||
local.aimtime = 0.50 + (randomint(50) / 100)
|
||||
local.firetime = 2 + (randomint(200) / 100)
|
||||
|
||||
self aimat $player
|
||||
wait local.aimtime
|
||||
level.tanksoldierusemg = 1
|
||||
wait local.firetime
|
||||
level.tanksoldierusemg = 0
|
||||
|
||||
// level.tanksoldierusemg = 1
|
||||
// self anim 21G303_Fire
|
||||
// self waittill animdone
|
||||
// level.tanksoldierusemg = 0
|
||||
}
|
||||
else if ( local.rnd < 80 )
|
||||
{
|
||||
// pause 20%
|
||||
local.lastaction = 2
|
||||
local.attackcount = 0
|
||||
self turnto NULL
|
||||
self aimat NULL
|
||||
self anim 21G302_Pause
|
||||
self waittill animdone
|
||||
}
|
||||
else if ( local.lastaction != 3 )
|
||||
{
|
||||
// talk below 20%
|
||||
local.lastaction = 3
|
||||
local.attackcount = 0
|
||||
self turnto NULL
|
||||
self aimat NULL
|
||||
self anim 21G304_TalkBelow
|
||||
self waittill animdone
|
||||
}
|
||||
}
|
||||
|
||||
wait 3
|
||||
self remove
|
||||
|
||||
// dprintln "~~~~~~~~~~~~~~~~~~~~~~~~~~~ end thread soldier_tank_attack"
|
||||
|
||||
end
|
||||
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
// this thread runs on the spawned soldier
|
||||
//
|
||||
// it causes the soldier to fire the machine gun
|
||||
// when the level.tanksoldierusemg variable is set to 1.
|
||||
// if the thread detects a drop in health, the firing
|
||||
// will cease for 2 seconds. this is a hack since there
|
||||
// is no way to determine if the soldier is taking a hit.
|
||||
//
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
soldier_tank_attack_firemg:
|
||||
|
||||
local.health = self.health
|
||||
|
||||
while ( isAlive self )
|
||||
{
|
||||
if ( self.health < local.health )
|
||||
{
|
||||
wait 2.0
|
||||
local.health = self.health
|
||||
}
|
||||
if ( level.tanksoldierusemg == 1 )
|
||||
{
|
||||
// <TWEAK> fire shot, wait cycle
|
||||
self fire
|
||||
wait 0.1
|
||||
}
|
||||
else
|
||||
{
|
||||
waitframe
|
||||
}
|
||||
}
|
||||
|
||||
// dprintln "~~~~~~~~~~~~~~~~~~~~~~~~~~~ end thread soldier_tank_attack_firemg"
|
||||
|
||||
end
|
1071
maps/tutorial/MP_Tutorial_TOW.map
Normal file
439
maps/tutorial/MP_Tutorial_TOW.scr
Normal file
|
@ -0,0 +1,439 @@
|
|||
// Tutorial_TOW
|
||||
//
|
||||
// Note: For objective function calls TakeOver and SetCurrent the
|
||||
// teams are as such:
|
||||
// 0 = Axis
|
||||
// 1 = Allies
|
||||
// 2 = Neutral
|
||||
|
||||
//----------------------------------------------------------
|
||||
// Main
|
||||
//----------------------------------------------------------
|
||||
main:
|
||||
|
||||
level.script="maps/obj/MP_Tutorial_TOW.scr"
|
||||
exec global/tow_dm.scr
|
||||
|
||||
level.gametype = int( getcvar( g_gametype ) )
|
||||
|
||||
//gametype 5 = Tug of War
|
||||
if( level.gametype == 5 )
|
||||
{
|
||||
setcvar "g_obj_alliedtext1" "Protect Spawn Point"
|
||||
setcvar "g_obj_alliedtext2" "Control Switch 1"
|
||||
setcvar "g_obj_alliedtext3" "Control Switch 2"
|
||||
setcvar "g_obj_alliedtext4" "Control Switch 3"
|
||||
setcvar "g_obj_alliedtext5" "Detonate Axis Spawn Point"
|
||||
|
||||
setcvar "g_obj_axistext1" "Protect Spawn Point"
|
||||
setcvar "g_obj_axistext2" "Control Switch 1"
|
||||
setcvar "g_obj_axistext3" "Control Switch 2"
|
||||
setcvar "g_obj_axistext4" "Control Switch 3"
|
||||
setcvar "g_obj_axistext5" "Destroy Allied Spawn Point"
|
||||
}
|
||||
else
|
||||
{
|
||||
//Not a TOW game remove the bombs
|
||||
$allie_bomb remove
|
||||
$axis_bomb remove
|
||||
|
||||
|
||||
// set scoreboard messages
|
||||
setcvar "g_obj_alliedtext1" "Tow Tutorial"
|
||||
setcvar "g_obj_alliedtext2" ""
|
||||
setcvar "g_obj_alliedtext3" ""
|
||||
setcvar "g_obj_axistext1" ""
|
||||
setcvar "g_obj_axistext2" ""
|
||||
setcvar "g_obj_axistext3" ""
|
||||
|
||||
}
|
||||
|
||||
//////////////////////////
|
||||
level waittill prespawn
|
||||
//////////////////////////
|
||||
|
||||
|
||||
//////////////////////////
|
||||
level waittill spawn
|
||||
//////////////////////////
|
||||
|
||||
level.bRoundStarted = 0
|
||||
|
||||
// level.bswitch1SwitchUp = 1
|
||||
// level.bswitch2SwitchUp = 1
|
||||
// level.bswitch3SwitchUp = 1
|
||||
level.axisFire = 1
|
||||
|
||||
// set the parameters for this round based match
|
||||
level.dmrespawning = 1 // 1 or 0
|
||||
level.dmroundlimit = 15 // round time limit in minutes
|
||||
level.clockside = draw // set to axis, allies, kills, or draw
|
||||
level.numObjectives = 5 // Number of objectives needed to win
|
||||
level.numAxisObjectives = 0 // Number of objectives taken by the axis
|
||||
level.numAlliedObjectives = 0 // Number of objectives taken by the allies
|
||||
|
||||
|
||||
//////////////////////////
|
||||
// level waittill roundstart
|
||||
//////////////////////////
|
||||
|
||||
//If this is a tug of war game then we init all the TOW stuff
|
||||
if( level.gametype == 5 )
|
||||
{
|
||||
//init the objectives
|
||||
thread init_objectives
|
||||
|
||||
thread init_spawner_bombs
|
||||
thread init_switch_lights
|
||||
|
||||
//Setup the starting team objectives
|
||||
thread set_objectives
|
||||
|
||||
level.bRoundStarted = 1
|
||||
}
|
||||
|
||||
|
||||
end
|
||||
|
||||
|
||||
//----------------------------------------------------------
|
||||
//Destroy the allied spawner here
|
||||
//----------------------------------------------------------
|
||||
alliesspawnpoint:
|
||||
|
||||
iprintln "The Allied Spawn Point has been Destroyed!"
|
||||
|
||||
//Take over the objective
|
||||
$Obj_alliespawnpoint TakeOver 0
|
||||
level.numAxisObjectives++
|
||||
level.numAlliedObjectives--
|
||||
|
||||
iprintln "The Allied Team Can No Longer Respawn!"
|
||||
|
||||
waitthread Check_End_Match
|
||||
|
||||
end
|
||||
|
||||
//----------------------------------------------------------
|
||||
//Destroy the axis spawner here
|
||||
//----------------------------------------------------------
|
||||
axisspawnpoint:
|
||||
|
||||
iprintln "The Axis Spawn Point has been Destroyed!"
|
||||
|
||||
$Obj_axisspawnpoint TakeOver 1
|
||||
level.numAlliedObjectives++
|
||||
level.numAxisObjectives--
|
||||
|
||||
iprintln "The Axis Team Can No Longer Respawn!"
|
||||
|
||||
waitthread Check_End_Match
|
||||
|
||||
end
|
||||
|
||||
//----------------------------------------------------------
|
||||
//control switch 1 green/red
|
||||
//----------------------------------------------------------
|
||||
switch1:
|
||||
|
||||
if( level.bRoundStarted == 1 )
|
||||
{
|
||||
if( parm.other.dmteam == axis )
|
||||
{
|
||||
if( $Obj_switch1.ControlledBy != 0 )
|
||||
{
|
||||
$Obj_switch1 TakeOver 0
|
||||
level.numAxisObjectives++
|
||||
level.numAlliedObjectives--
|
||||
$obj2_light_allie hide
|
||||
$obj2_light_axis show
|
||||
iprintln "The Axis Control Switch 1!"
|
||||
|
||||
waitthread Check_End_Match
|
||||
}
|
||||
}
|
||||
else if( parm.other.dmteam == allies )
|
||||
{
|
||||
if( $Obj_switch1.ControlledBy != 1 )
|
||||
{
|
||||
$Obj_switch1 TakeOver 1
|
||||
level.numAlliedObjectives++
|
||||
level.numAxisObjectives--
|
||||
$obj2_light_axis hide
|
||||
$obj2_light_allie show
|
||||
|
||||
iprintln "The Allies Control Switch 1!"
|
||||
|
||||
waitthread Check_End_Match
|
||||
}
|
||||
}
|
||||
|
||||
//Update team current objectives
|
||||
thread set_objectives
|
||||
}
|
||||
|
||||
end
|
||||
|
||||
//----------------------------------------------------------
|
||||
//control switch 2 green/red
|
||||
//----------------------------------------------------------
|
||||
switch2:
|
||||
|
||||
if( level.bRoundStarted == 1 )
|
||||
{
|
||||
if( parm.other.dmteam == axis )
|
||||
{
|
||||
if( $Obj_switch2.ControlledBy != 0 )
|
||||
{
|
||||
$Obj_switch2 TakeOver 0
|
||||
level.numAxisObjectives++
|
||||
level.numAlliedObjectives--
|
||||
$obj3_light_allie hide
|
||||
$obj3_light_axis show
|
||||
|
||||
iprintln "The Axis Control Switch 2!"
|
||||
|
||||
waitthread Check_End_Match
|
||||
}
|
||||
}
|
||||
else if( parm.other.dmteam == allies )
|
||||
{
|
||||
if( $Obj_switch2.ControlledBy != 1 )
|
||||
{
|
||||
$Obj_switch2 TakeOver 1
|
||||
level.numAlliedObjectives++
|
||||
level.numAxisObjectives--
|
||||
$obj3_light_axis hide
|
||||
$obj3_light_allie show
|
||||
|
||||
iprintln "The Allies Control Switch 2!"
|
||||
|
||||
waitthread Check_End_Match
|
||||
}
|
||||
}
|
||||
|
||||
//Update team current objectives
|
||||
thread set_objectives
|
||||
}
|
||||
|
||||
end
|
||||
|
||||
//----------------------------------------------------------
|
||||
//control switch 3 green/red
|
||||
//----------------------------------------------------------
|
||||
switch3:
|
||||
|
||||
if( level.bRoundStarted == 1 )
|
||||
{
|
||||
if( parm.other.dmteam == axis )
|
||||
{
|
||||
if( $Obj_switch3.ControlledBy != 0 )
|
||||
{
|
||||
$Obj_switch3 TakeOver 0
|
||||
level.numAxisObjectives++
|
||||
level.numAlliedObjectives--
|
||||
$obj4_light_allie hide
|
||||
$obj4_light_axis show
|
||||
|
||||
iprintln "The Axis Control Switch 3!"
|
||||
|
||||
waitthread Check_End_Match
|
||||
}
|
||||
}
|
||||
else if( parm.other.dmteam == allies )
|
||||
{
|
||||
if( $Obj_switch3.ControlledBy != 1 )
|
||||
{
|
||||
$Obj_switch3 TakeOver 1
|
||||
level.numAlliedObjectives++
|
||||
level.numAxisObjectives--
|
||||
$obj4_light_axis hide
|
||||
$obj4_light_allie show
|
||||
|
||||
iprintln "The Allies Control Switch 3!"
|
||||
|
||||
waitthread Check_End_Match
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//Update team current objectives
|
||||
thread set_objectives
|
||||
}
|
||||
|
||||
end
|
||||
|
||||
|
||||
//----------------------------------------------------------
|
||||
//Set the teams current objectives
|
||||
//----------------------------------------------------------
|
||||
set_objectives:
|
||||
|
||||
//First lets do the allies
|
||||
if( $Obj_switch3.ControlledBy == 0 )
|
||||
{
|
||||
$Obj_switch3 SetCurrent 1
|
||||
}
|
||||
else if( $Obj_switch2.ControlledBy == 0 )
|
||||
{
|
||||
$Obj_switch2 SetCurrent 1
|
||||
}
|
||||
else if( $Obj_switch1.ControlledBy == 0 )
|
||||
{
|
||||
$Obj_switch1 SetCurrent 1
|
||||
}
|
||||
else if( $Obj_axisspawnpoint.ControlledBy == 0 )
|
||||
{
|
||||
$Obj_axisspawnpoint SetCurrent 1
|
||||
}
|
||||
|
||||
//Now the Axis
|
||||
if( $Obj_switch1.ControlledBy == 1 )
|
||||
{
|
||||
$Obj_switch1 SetCurrent 0
|
||||
}
|
||||
else if( $Obj_switch2.ControlledBy == 1 )
|
||||
{
|
||||
$Obj_switch2 SetCurrent 0
|
||||
}
|
||||
else if( $Obj_switch3.ControlledBy == 1 )
|
||||
{
|
||||
$Obj_switch3 SetCurrent 0
|
||||
}
|
||||
else if( $Obj_alliespawnpoint.ControlledBy == 1 )
|
||||
{
|
||||
$Obj_alliespawnpoint SetCurrent 0
|
||||
}
|
||||
|
||||
end
|
||||
|
||||
//--------------------------------------------------------------
|
||||
//init the spawner bombs
|
||||
//--------------------------------------------------------------
|
||||
init_spawner_bombs:
|
||||
|
||||
//Allied spawner bomb
|
||||
$axis_bomb thread global/tow_dm.scr::bomb_thinker "axis" maps/obj/MP_Tutorial_TOW.scr::alliesspawnpoint
|
||||
$allie_bomb thread global/tow_dm.scr::bomb_thinker "allies" maps/obj/MP_Tutorial_TOW.scr::axisspawnpoint
|
||||
end
|
||||
|
||||
//-----------------------------------------------
|
||||
// Blow up Allied Spawner
|
||||
//-----------------------------------------------
|
||||
axis_bomb_relay_explode:
|
||||
|
||||
self waittill trigger
|
||||
thread alliesspawnpoint
|
||||
end
|
||||
|
||||
//-----------------------------------------------
|
||||
// Blow up Axis Spawner
|
||||
//-----------------------------------------------
|
||||
allie_bomb_relay_explode:
|
||||
|
||||
self waittill trigger
|
||||
thread axisspawnpoint
|
||||
end
|
||||
|
||||
//----------------------------------------------------------
|
||||
//Initialize the switch lights (start all lights off)
|
||||
//----------------------------------------------------------
|
||||
init_switch_lights:
|
||||
|
||||
$obj2_light_allie hide
|
||||
$obj2_light_axis hide
|
||||
$obj3_light_allie hide
|
||||
$obj3_light_axis hide
|
||||
$obj4_light_allie hide
|
||||
$obj4_light_axis hide
|
||||
|
||||
end
|
||||
|
||||
//-----------------------------------------------
|
||||
// init the objectives
|
||||
//-----------------------------------------------
|
||||
init_objectives:
|
||||
|
||||
//Allied spawn point
|
||||
if( $Obj_alliespawnpoint.ControlledBy == 0 )
|
||||
{
|
||||
level.numAxisObjectives++
|
||||
}
|
||||
else if( $Obj_alliespawnpoint.ControlledBy == 1 )
|
||||
{
|
||||
level.numAlliedObjectives++
|
||||
}
|
||||
|
||||
//Axis spawn point
|
||||
if( $Obj_axisspawnpoint.ControlledBy == 0 )
|
||||
{
|
||||
level.numAxisObjectives++
|
||||
}
|
||||
else if( $Obj_axisspawnpoint.ControlledBy == 1 )
|
||||
{
|
||||
level.numAlliedObjectivse++
|
||||
}
|
||||
|
||||
//switch 1
|
||||
if( $Obj_switch1.ControlledBy == 0 )
|
||||
{
|
||||
level.numAxisObjectives++
|
||||
}
|
||||
else if( $Obj_switch1.ControlledBy == 1 )
|
||||
{
|
||||
level.numAlliedObjectives++
|
||||
}
|
||||
|
||||
//switch 2
|
||||
if( $Obj_switch2.ControlledBy == 0 )
|
||||
{
|
||||
level.numAxisObjectives++
|
||||
}
|
||||
else if( $Obj_switch2.ControlledBy == 1 )
|
||||
{
|
||||
level.numAlliedObjectives++
|
||||
}
|
||||
|
||||
//switch 3
|
||||
if( $Obj_switch3.ControlledBy == 0 )
|
||||
{
|
||||
level.numAxisObjectives++
|
||||
}
|
||||
else if( $Obj_switch3.ControlledBy == 1 )
|
||||
{
|
||||
level.numAlliedObjectives--
|
||||
}
|
||||
|
||||
end
|
||||
|
||||
//-----------------------------------------------
|
||||
// init the objectives
|
||||
//-----------------------------------------------
|
||||
Check_End_Match:
|
||||
|
||||
//Allies first
|
||||
if( level.numAlliedObjectives == level.numObjectives )
|
||||
{
|
||||
//ignore the clock
|
||||
level ignoreclock 1
|
||||
|
||||
//if there is a bomb ticking stop it.
|
||||
waitthread global/tow_dm.scr::StopBomb
|
||||
|
||||
//Allies win play the movie
|
||||
teamwin allies
|
||||
}
|
||||
else if( level.numAxisObjectives == level.numObjectives )
|
||||
{
|
||||
//ignore the clock
|
||||
level ignoreclock 1
|
||||
|
||||
//if there is a bomb ticking stop it.
|
||||
waitthread global/tow_dm.scr::StopBomb
|
||||
|
||||
//Axis win do their movie and end the map
|
||||
teamwin axis
|
||||
}
|
||||
|
||||
end
|
||||
|
BIN
maps/tutorial/Mp_Tutorial_TOW.bsp
Normal file
70
maps/tutorial/Test_Tanks.Scr
Normal file
|
@ -0,0 +1,70 @@
|
|||
//-------------------------------------------------------------------------------
|
||||
// Test_Tanks.Scr
|
||||
//
|
||||
// - Example code used to have the player drive a tank.
|
||||
// - Examples of enemy tanks on paths attacking player tank.
|
||||
//
|
||||
//
|
||||
//-------------------------------------------------------------------------------
|
||||
|
||||
level waittill prespawn
|
||||
level waittill spawn
|
||||
|
||||
main:
|
||||
level.lookahead = 256 // how far enemy tanks "look ahead" when driving
|
||||
level.enemytankspeed = 200 // how fast the enemy tanks are
|
||||
level.sightdistance = 2048 // how far the enemy tanks can "see"
|
||||
|
||||
$player holster
|
||||
$player takeall
|
||||
$player physics_off
|
||||
|
||||
$playertank waitthread global/vehicles_thinkers.scr::players_tank NULL
|
||||
$playertank vehiclespeed 200
|
||||
|
||||
thread second_tank
|
||||
|
||||
// setup enemy tank targets...
|
||||
level.playertanktarget = $player
|
||||
|
||||
wait 5
|
||||
|
||||
|
||||
$s5_tank1 thread TankGo $s5_tank_path level.enemytankspeed empty_panzer_desert
|
||||
|
||||
end
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
second_tank:
|
||||
//----------------------------------------------------------------------
|
||||
$tank2_trigger waittill trigger
|
||||
$tank2 thread TankGo $start_tank2 level.enemytankspeed empty_panzer_desert
|
||||
|
||||
end
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
TankGo local.path local.speed local.type:
|
||||
//----------------------------------------------------------------------
|
||||
|
||||
|
||||
self immune aagun
|
||||
self thread global/vehicles_thinkers.scr::enemy_tank_think 0 local.type
|
||||
self thread drive_path local.path local.speed
|
||||
|
||||
end
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
drive_path local.path local.speed:
|
||||
//----------------------------------------------------------------------
|
||||
self.driving = 1
|
||||
|
||||
// drive Vector position, speed, acceleration, reach_distance, look_ahead
|
||||
self drive local.path local.speed 30 200 level.lookahead
|
||||
self waittill drive
|
||||
if (self)
|
||||
{
|
||||
self stop
|
||||
self.driving = 0
|
||||
}
|
||||
|
||||
end
|
31
maps/tutorial/Test_VehicleDrive.Scr
Normal file
|
@ -0,0 +1,31 @@
|
|||
//-------------------------------------------------------------------------------
|
||||
// Test_VehicleDrive.Scr
|
||||
//
|
||||
// - Example code used to have the player drive a tank.
|
||||
// (as in t3l2)
|
||||
//
|
||||
//
|
||||
// NOTES:
|
||||
// In the editor, be sure to have the player vehicle target the appropriate
|
||||
// collision entity.
|
||||
//-------------------------------------------------------------------------------
|
||||
|
||||
level waittill prespawn
|
||||
level waittill spawn
|
||||
|
||||
main:
|
||||
$playertank.collisionent = $playertank.target
|
||||
|
||||
level.playertanktarget = $player
|
||||
|
||||
$player holster
|
||||
$player takeall
|
||||
$player physics_off
|
||||
|
||||
$playertank waitthread global/vehicles_thinkers.scr::players_tank $playertank_trigger
|
||||
$playertank vehiclespeed 200
|
||||
|
||||
|
||||
|
||||
end
|
||||
|
48
maps/tutorial/Test_VehicleRide.Scr
Normal file
|
@ -0,0 +1,48 @@
|
|||
//-------------------------------------------------------------------------------
|
||||
// Test_VehicleRide.Scr
|
||||
//
|
||||
// - Example code used to have the player ride as a passenger in a vehicle.
|
||||
// (as in t2l2)
|
||||
//
|
||||
//
|
||||
// NOTES:
|
||||
// In the editor, be sure to have the player vehicle target the appropriate
|
||||
// collision entity.
|
||||
//-------------------------------------------------------------------------------
|
||||
|
||||
level waittill prespawn
|
||||
level waittill spawn
|
||||
|
||||
main:
|
||||
|
||||
level.playerjeep = $s1_jeep1
|
||||
level.playerjeep nodamage // don't want the vehicle to be damaged
|
||||
|
||||
level.playerjeep thread global/vehicles_thinkers.scr::PLAYER_JEEP_CONTROLLER
|
||||
level.playerjeep thread PLAYER_JEEP_Drive
|
||||
|
||||
end
|
||||
|
||||
//-------------------------------------------------------------------------------
|
||||
PLAYER_JEEP_Drive:
|
||||
//
|
||||
// This is where you can define the path you want the vehicle to take...
|
||||
//-------------------------------------------------------------------------------
|
||||
// speed
|
||||
self drive $jeepfirstpath 250
|
||||
// speed accel look_ahead
|
||||
self modifydrive 250 100 256
|
||||
self waittill drive
|
||||
self stop
|
||||
|
||||
wait 5
|
||||
|
||||
self drive $path_two 250
|
||||
// speed accel look_ahead
|
||||
self modifydrive 500 100 256
|
||||
self waittill drive
|
||||
self stop
|
||||
|
||||
|
||||
end
|
||||
|
11356
maps/tutorial/exploder_tutorial.map
Normal file
29
maps/tutorial/exploder_tutorial.scr
Normal file
|
@ -0,0 +1,29 @@
|
|||
main:
|
||||
level.script = "maps/exploder_tutorial.scr"
|
||||
|
||||
//////////////////////////////
|
||||
level waittill prespawn
|
||||
//////////////////////////////
|
||||
|
||||
exec global/ambient.scr
|
||||
exec global/exploder.scr
|
||||
|
||||
//////////////////////////////
|
||||
level waittill spawn
|
||||
//////////////////////////////
|
||||
|
||||
end
|
||||
|
||||
//----------------------------------------------------------
|
||||
//Destroy the door
|
||||
//----------------------------------------------------------
|
||||
boom:
|
||||
thread global/exploder.scr::explode 2
|
||||
end
|
||||
|
||||
//----------------------------------------------------------
|
||||
//Destroy the base
|
||||
//----------------------------------------------------------
|
||||
kablam:
|
||||
thread global/exploder.scr::explode 1
|
||||
end
|