<?xml version="1.0"?>
<rss version="2.0"><channel><title>Documentation: Documentation</title><link>https://w3dhub.com/forum/documentation/articles/?d=1</link><description>Documentation: Documentation</description><language>en</language><item><title>Scripts 5.0 Public Changelog</title><link>https://w3dhub.com/forum/documentation/articles/scripts-50-public-changelog-r5/</link><description><![CDATA[<h4>
	<strong>Current public <abbr title="Red Alert: A Path Beyond">APB</abbr> build:</strong> <a data-anchor="APB" data-base-url="http://tacitus.w3dhub.com" data-linked-resource-default-alias="APB" href="#Scripts5.0PublicChangelog-APB" rel="">Jul 20 2019</a><br>
	<strong>Current public <abbr title="Tiberian Sun: Reborn">TSR</abbr> build:</strong> <em>&lt;old as shit&gt;</em>
</h4>

<h4>
	Oct 28 2019
</h4>

<ul>
	<li>
		Added a replacement for the help screen, based off the old Renegade in-game encyclopedia from it's single player mode.
		<ul>
			<li>
				Toggleable via tt.ini
			</li>
			<li>
				Will show everything in MP, in SP will use older unlock logic.
			</li>
		</ul>
	</li>
</ul>

<h4>
	Oct 27 2019
</h4>

<ul>
	<li>
		Overhaul of the muzzle logic, which allows for 26 different muzzle 'sets', each with a varying number of muzzle bones.
		<ul>
			<li>
				Added options in the weapons to choose which muzzle sets a weapon uses, ideal for swapping weapons in a vehicle.
			</li>
		</ul>
	</li>
</ul>

<h4>
	Oct 14 2019
</h4>

<ul>
	<li>
		Added orthographic camera toggle to the view menu in Mammoth. Has some edge cases where object selection might not work as expected, otherwise fully functional.
	</li>
	<li>
		Added roll/pitch/yaw and orthographic view size to "Goto Location" (Ctrl+G)
	</li>
	<li>
		Fixed editing objects that have non-zero X/Y rotation (previously, double-clicking on an object and pressing OK without any changes would rotate them in a weird way).
		<ul>
			<li>
				Enabled X/Y rotation edit fields.
			</li>
		</ul>
	</li>
</ul>

<h4>
	Oct 09 2019
</h4>

<ul>
	<li>
		New radar option: shows objects close to player and all allies regardless of distance.
		<ul>
			<li>
				ROM_Map script can set this new option:<br>
				0 = Show everything<br>
				1 = Show only close to player<br>
				2 = Show close to player and allies
			</li>
		</ul>
	</li>
</ul>

<h4>
	Oct 08 2019
</h4>

<ul>
	<li>
		<p>
			Scaling for proxied objects and infantry
		</p>

		<ul>
			<li>
				<p>
					Any proxy object in Max that has<code> $ </code>as its first character will make use of the scaling information in the Max object (e.g setting the proxied object to have 200% XYZ scaling will make the object 2x as big when the level is loaded)
				</p>
			</li>
			<li>
				Soldier presets have a new<code> ModelScale </code>setting. The camera height and origin offset will automatically scale with it.
			</li>
			<li>
				<strong>IMPORTANT</strong>:
				<ul>
					<li>
						Only uniform scales are supported for now (same scale on all axes). Non-uniform scales will <em>seem</em> like they're working, but they will introduce subtle bugs!
					</li>
					<li>
						Non-mesh objects (e.g. zones) are untested and unlikely to work.
					</li>
					<li>
						Animated or otherwise moving/dynamic meshes (e.g. elevators, shatterable windows) are untested.
					</li>
				</ul>
			</li>
		</ul>
	</li>
</ul>

<h4>
	Oct 07 2019
</h4>

<ul>
	<li>
		Mouse steering improvements:
		<ul>
			<li>
				Added a new flag to Controls that allows users to select whether they want mouse steering on VTOLs. Only affects vehicles that had mouse steering enabled in Mammoth (i.e things like <abbr title="Red Alert: A Path Beyond">APB</abbr> Subs won't be affected)
			</li>
			<li>
				VTOLs with mouse steering can disable steering while holding the "Cursor Targeting" key (default is V), this allows them to look around without moving. Steering and strafing reverts to the keyboard-only versions while this button is held.
			</li>
		</ul>
	</li>
</ul>

<h4>
	Sep 30 2019
</h4>

<ul>
	<li>
		<p>
			Mammoth's "Export String Table" and "Import Tab Delimited" functions (English-only strings import/export) can now correctly handle newlines and other special characters.
		</p>
	</li>
	<li>
		<p>
			Added functionality to add new key actions to the game after release.
		</p>

		<ul>
			<li>
				<p>
					<code>default_input.cfg</code> gains a new section called "New Actions". The entries are of the format <code>ActionName=BuildNumber</code>, where <code>ActionName</code> is something like <code>Jump</code> or <code>VehicleToggleGunner</code> and <code>BuildNumber</code> is the scripts build number in which the new action was introduced to the game (e.g. 10753).
				</p>
			</li>
			<li>
				<p>
					The engine saves its current build number into the config.dat file, separately for each every input config. It can then compare the saved build number to the entries in "New Actions" to determine whether those were added since the last time the player has played the game.
				</p>
			</li>
			<li>
				<p>
					The new actions will automatically be bound to their specified default keys. The player will then receive an ingame-notification of the new action. If none of the default keys could be bound due to conflicts with existing keybindings, the notification will say so and direct the player towards the controls menu.
				</p>
			</li>
			<li>
				<p>
					New strings.tdb entries:<br>
					<code>IDS_VERSIONED_KEYBINDS_TITLE</code>: Title of the message window<br>
					<code>IDS_VERSIONED_KEYBINDS_SUCCESS</code>: Message when default keys were successfully bound<br>
					<code>IDS_VERSIONED_KEYBINDS_CONFLICT</code>: Message on failure due to conflicts<br>
					<code>IDS_FUNCTION_VEHICLE_TOGGLE_GUNNER</code>: Translated name of the new action that was already introduced ages ago. Used for toggle gunner, CTOL landing gear toggle, jetpack toggle.
				</p>
			</li>
		</ul>
	</li>
</ul>

<h4>
	Sep 29 2019
</h4>

<ul>
	<li>
		64 bit builds of the engine (and editor, tools) are now officially supported, can be downloaded manually via Jenkins
	</li>
</ul>

<h4>
	Sep 23 2019
</h4>

<ul>
	<li>
		Made light solve pass through translucent meshes (alpha test/blend). This usually improves lighting, makes it possible to decrease excessive fake lighting inside windowed buildings.
	</li>
	<li>
		<p>
			New console command <code>DEBUG_SHOW_DISTANCE</code>: Shows the distance to the surface under the crosshair in the top right.
		</p>
	</li>
</ul>

<h4>
	Sep 21 2019
</h4>

<ul>
	<li>
		Spectators no longer take damage from scripts and zones.
	</li>
	<li>
		Spectators no longer get blinded by the gap generator.
	</li>
	<li>
		<p>
			Added four new console commands to show bounding boxes:
		</p>

		<ul>
			<li>
				<p>
					<code>CULL_SHOW_BUILDING_BOXES</code> for buildings
				</p>
			</li>
			<li>
				<p>
					<code>CULL_SHOW_SOUND_BOXES</code> for sounds
				</p>
			</li>
			<li>
				<p>
					<code>CULL_SHOW_PROJECTILE_BOXES</code> for projectiles
				</p>
			</li>
			<li>
				<p>
					<code>CULL_SHOW_PHYS_BOXES</code> <code>&lt;type&gt;</code> for physical objects.<code> &lt;type&gt;</code> is a bitmask and can be specified with either decimal or hexadecimal numbers (with 0x prefix). This means you can add the values in the table below to display multiple types at once.
				</p>

				<table>
					<colgroup>
						<col>
						<col>
						<col>
					</colgroup>
					<tbody>
						<tr>
							<th>
								Value
							</th>
							<th>
								Color
							</th>
							<th>
								Type
							</th>
						</tr>
						<tr>
							<td>
								1
							</td>
							<td>
								Magenta-ish <span style="color:#ff00ff">♦</span>
							</td>
							<td>
								Emitters
							</td>
						</tr>
						<tr>
							<td>
								2
							</td>
							<td>
								Any Color <span style="color:#000000">♦</span>
							</td>
							<td>
								Static Objects (Elevators/Doors = Red, Damageable = Green)
							</td>
						</tr>
						<tr>
							<td>
								4
							</td>
							<td>
								Cyan-ish <span style="color:#00ffff">♦</span>
							</td>
							<td>
								Soldiers / Vehicles
							</td>
						</tr>
						<tr>
							<td>
								8
							</td>
							<td>
								Yellow-ish <span style="color:#ffff00">♦</span>
							</td>
							<td>
								Lights
							</td>
						</tr>
						<tr>
							<td>
								16
							</td>
							<td>
								Any Color <span style="color:#000000">♦</span>
							</td>
							<td>
								Projectiles
							</td>
						</tr>
						<tr>
							<td colspan="1">
								32
							</td>
							<td colspan="1">
								White <span style="color:#ffffff">♦</span>
							</td>
							<td colspan="1">
								<p>
									Others (Decorations, Pseudo-Vehicle Structures)
								</p>
							</td>
						</tr>
					</tbody>
				</table>

				<p>
					 
				</p>
			</li>
		</ul>
	</li>
	<li>
		(Started work on 64 bit port of the engine)
	</li>
</ul>

<h4>
	Sep 19 2019
</h4>

<ul>
	<li>
		<code>IsDamageZone</code> weapons can hurt damageable static objects again (walls/gates).
	</li>
	<li>
		<p>
			Sniper zoom now works in 10 consistent steps (one step per mouse wheel tick). Previously it was framerate-dependent in a weird way.
		</p>
	</li>
</ul>

<h4>
	Sep 18 2019
</h4>

<ul>
	<li>
		<p>
			Modified barrel bone code to also take <code>BarrelBxx</code> bones (currently setto a maximum of 2 each)
		</p>
	</li>
</ul>

<h4>
	Sep 17 2019
</h4>

<ul>
	<li>
		<p>
			Jetpack physics fixes:
		</p>

		<ul>
			<li>
				<p>
					Added actual momentum to the calculations, should make jetpack flight behavior much more consistent (will need to fine tune the parameters though)
				</p>
			</li>
			<li>
				<p>
					Fixed the bouncy collisions, flight mode will simply make the model press and slide against surfaces (potential risk of getting stuck, but it's still better than the bouncy behavior)
				</p>
			</li>
		</ul>
	</li>
	<li>
		<p>
			Underwater physics:
		</p>

		<ul>
			<li>
				<p>
					Moved functionality of <code>RA_Underwater_Target_Hider</code> to the engine (script zone now simply sets underwater state).
				</p>
			</li>
			<li>
				<p>
					Added opacity parameter to global water FX settings
				</p>
			</li>
			<li>
				Add a new Submerge Level setting to the "level settings" dialog and use it to determine when the submarine should submerge/surface. The current Water Level setting will be used to determine the surface of the water for the underwater tint, hurt unit script and underwater target hider.
			</li>
			<li>
				<p>
					Add <code>Underwater Damage Warhead</code>, <code>Underwater Damage Amount</code> and <code>Underwater Surface Type</code> to <code>Global Settings/General</code> in Mammoth. When an infantry or vehicle unit is underwater, every frame tick it will apply underwater damage using the warhead and amount values.
				</p>
			</li>
			<li>
				A soldier or vehicle is now considered underwater whenever it is below<code> Water Level </code>(level settings), but above a surface that has the type<code> Underwater Surface Type </code>(<code>Global Settings/General</code>, determined via raycast straight down).
			</li>
			<li>
				<p>
					Several bug fixes (ongoing...)
				</p>
			</li>
		</ul>
	</li>
	<li>
		Fixed W3DViewer not respecting camera alignment flags on meshes.
	</li>
</ul>

<h4>
	Sep 16 2019
</h4>

<ul>
	<li>
		Add second warhead to <code>JFW_EMP_New</code>
	</li>
</ul>

<h4>
	Sep 13 2019
</h4>

<ul>
	<li>
		<p>
			Integrated underwater skyblocker and fog into level settings, will apply globally to all vehicles that enter the water death zone (except ships and submarines)
		</p>
	</li>
</ul>

<h4>
	Sep 12 2019
</h4>

<ul>
	<li>
		<p>
			Made ammo with <code>IsDamageZone</code> ticked no longer "collide" with terrain or teammates.
		</p>

		<ul>
			<li>
				<p>
					This should allow using explosions or hitter effects for additional audio-visual feedback.
				</p>
			</li>
			<li>
				<p>
					Note that this means they no longer damage non-targetable things like walls.
				</p>
			</li>
		</ul>
	</li>
	<li>
		<p>
			Changed name of console command <code>TOGGLE_PROJ_BOUNDS</code> to <code>PROJ_BOUNDS_ENABLE</code>.
		</p>
	</li>
	<li>
		<p>
			Added console command <code>PROJ_SLOW_MODE &lt;velocity&gt;</code>. This will slow down time by a different amount for each projectile in order to make them hit a specific velocity in <code>m/s</code>.
		</p>
	</li>
</ul>

<h4>
	Sep 11 2019
</h4>

<ul>
	<li>
		Modified <code>JFW_Fog_Controller</code>, the script now only handles the <abbr title="Red Alert: A Path Beyond">APB</abbr> Gap Gen effect. Swimming infantry and submarine fog and skyblocker effects have been moved to the engine.
	</li>
</ul>

<h4>
	Sep 09 2019
</h4>

<ul>
	<li>
		<p>
			Moved the logic from <code>JFW_Swim_Script</code> into the human physics engine.
		</p>

		<ul>
			<li>
				<p>
					Can copy the script parameters into the physics definition to get the same behavior.
				</p>
			</li>
		</ul>
	</li>
</ul>

<h4>
	Sep 08 2019
</h4>

<ul>
	<li>
		<p>
			Added two flags to refinery building definition:
		</p>

		<ul>
			<li>
				<p>
					<code>PlayUnloadAnimationAfterDock</code>: If ticked, instead of playing the refinery's docking animation as the harvester docks, it instead only plays it after it's docked.
				</p>
			</li>
			<li>
				<code>RefineryUnloadMeshName</code>: Name of the mesh that the refinery dump code looks for so that an animation will play when a harvester docks (was hardcoded to "<code>REF_TIB_DUMP</code>").
			</li>
		</ul>
	</li>
	<li>
		<p>
			New submarine physics:
		</p>

		<ul>
			<li>
				<p>
					Implemented a new physics type for submarines, derived straight from VTOL, so the old settings will result in the same behavior
				</p>
			</li>
			<li>
				<p>
					The functionality from <code>JFW_Submarine</code> and related scripts are moved into the engine (not yet finished), so all visual FX will be handled on the client side, and all gameplay changes on the server side
				</p>
			</li>
			<li>
				<p>
					Added a new global parameter for levels to set the water level (default is <code>-1000</code>)
				</p>
			</li>
		</ul>
	</li>
	<li>
		<p>
			Massively enhanced gatling logic
		</p>

		<ul>
			<li>
				<p>
					First person gatling weapons are now doable; use same bone names (<code>spin_barrel_0/spin_barrel_1</code>)
				</p>
			</li>
			<li>
				<p>
					Gatling logic now has a sound slot for a motor sound (<code>GatlingContinuousMotorSoundID</code>), that can be affected by the rotation speed, and a min and a max pitch (<code>GatlingMinimumContSoundPitch/GatlingMaximumContSoundPitch</code>)
				</p>
			</li>
		</ul>
	</li>
</ul>

<h4>
	Sep 01 2019
</h4>

<ul>
	<li>
		Added new surface type <code>Laser</code> (needs new Max 2017 plugin)
	</li>
	<li>
		Enabled "lock vehicle camera to turret" option by default (for people who have never run the game before).
	</li>
</ul>

<h4>
	Aug 31 2019
</h4>

<ul>
	<li>
		Added optional frame interpolation to all grid texture mappers. Enable by adding <code>Interpolate=True</code> to the mapper arguments.
	</li>
</ul>

<h4>
	Aug 28 2019
</h4>

<ul>
	<li>
		Added wireframe mode to the renderer. Can be enabled globally in the editor and game (<code>R_WIREFRAME_ENABLE</code> console command).

		<ul>
			<li>
				Is internally available as a material property (so could be enabled for individual objects/passes), but is currently not exposed to mod developers (can be added on request or used for debug views).
			</li>
		</ul>
	</li>
	<li>
		Added MSAA setting to the View menu in Mammoth, now defaults to 4x instead of OFF (helps wireframe mode in particular).
	</li>
</ul>

<h4>
	Aug 27 2019
</h4>

<ul>
	<li>
		Some code changes to shader management (among other things like D3D resource leak fixes), project devs should regenerate the shader cache once (in Mammoth) to make live shader development easier for the coders.
	</li>
</ul>

<h4>
	Aug 26 2019
</h4>

<ul>
	<li>
		Added <code>ADDWEAPON</code> console command. Put player id and preset name and it adds an infinite ammo instance of that weapon to that player's current char class.
	</li>
</ul>

<h4>
	Aug 25 2019
</h4>

<ul>
	<li>
		Fixed Max 2017 plugin not exporting static sort level
	</li>
</ul>

<h4>
	Aug 22 2019
</h4>

<ul>
	<li>
		Fixed Max 2017 plugin not exporting smooth skinning flag
	</li>
	<li>
		VTOL engine flame bones no longer spin (use texture mappers instead)
	</li>
</ul>

<h4>
	Aug 20 2019
</h4>

<ul>
	<li>
		Significantly improved level export times:
		<ul>
			<li>
				Add some more detailed timing output to Artillery and Mammoth.
			</li>
			<li>
				Artillery's asset collection after Mammoth export is now roughly 50x faster, making artillery overhead overall negligible
			</li>
			<li>
				Reduced Mammoth level load time in batch mode by roughly 50% (disabled shader compiles and constant buffer creation)
			</li>
		</ul>
	</li>
	<li>
		Added option to do a light solve only for the objects currently visible in the Mammoth viewport to help lighting design iteration (available in menu and toolbar and via <code>Ctrl+Alt+L</code>)
	</li>
	<li>
		New weapon flags <code>GatlingCannotFireWhileWarmingUp</code> and <code>GatlingSpinningStopsDuringReload</code>
	</li>
</ul>

<h4>
	Aug 18 2019
</h4>

<ul>
	<li>
		Added spinning barrel weapon logic. New parameters <code>UseGattlingLogic, GattlingWarmUpTime, GattlingWarmDownMultiplier</code>
	</li>
</ul>

<h4>
	Aug 16 2019
</h4>

<ul>
	<li>
		Added toolbar to Mammoth
	</li>
	<li>
		Fixed loud sounds playing when loading into the game (by muting the sound ololol)
	</li>
</ul>

<h4>
	Aug 14 2019
</h4>

<ul>
	<li>
		Improved performance of debug visualizers (used for pathfind visualization in Mammoth, <code>TOGGLE_PROJ_BOUNDS</code> ingame, etc.)
	</li>
	<li>
		Added menu option to Mammoth to visualize the flight ceiling.
	</li>
	<li>
		<code>TOGGLE_PROJ_BOUNDS</code> now works in singleplayer games without the <code>tt.ini</code> entry (just like <code>EDIT_VEHICLE</code>, etc.)
		<ul>
			<li>
				Added shot direction indicator
			</li>
		</ul>
	</li>
	<li>
		<code>IsQuickCastAbility</code> weapon flag:
		<ul>
			<li>
				Fixed erroneous server-side weapon fire on vehicle enter/exit.
			</li>
			<li>
				Now works with vehicles
				<ul>
					<li>
						<code>ContinueReloadOnVehicleExit</code> in <code>tt.ini</code> must be false for this to really work (unless you want empty vehicles to just fire away)
					</li>
					<li>
						Attached turret vehicles check whether their parent vehicle is disabled (e.g. underground) before firing
					</li>
				</ul>
			</li>
		</ul>
	</li>
	<li>
		Added <code>IgnoreCollisionWithParentOfOwner</code> to ammo definitions. Use for attached turret vehicles to prevent misfire.
	</li>
	<li>
		<p>
			Added <code>IsDamageZone</code> to ammo definitions.
		</p>

		<ul>
			<li>
				<p>
					Instantly damages everything within a box of size <code>ProjectileExtent</code>
				</p>
			</li>
			<li>
				<p>
					Will spawn beam effects and explosions for every target hit <em>(not well-tested!)</em>
				</p>
			</li>
			<li>
				<p>
					<code>Range</code> is ignored, just set the <code>ProjectileExtent.X</code> value
				</p>
			</li>
			<li>
				<p>
					Box orientation affected by weapon spray/recoil
				</p>
			</li>
			<li>
				<p>
					Set velocity to something greater than 0 or it will not work
				</p>
			</li>
		</ul>
	</li>
</ul>

<h4>
	Aug 13 2019
</h4>

<ul>
	<li>
		W3D Exporter: Fixed an issue with zero bone weights
	</li>
</ul>

<h4>
	Aug 11 2019
</h4>

<ul>
	<li>
		W3D Exporter: Fix issue where 2 materials with the same data but on different passes were incorrectly being combined into one material in the resulting w3d file
	</li>
	<li>
		Added a "MechWalker" script to simplify walkers. fix hitching and animation sliding/reversing issues
	</li>
</ul>

<h4>
	Aug 09 2019
</h4>

<ul>
	<li>
		For coders: Migration to Visual Studio 2019 and Windows 10 SDK
	</li>
</ul>

<h4>
	Aug 07 2019
</h4>

<ul>
	<li>
		<code>JFW_Kill_Message_Display </code><span style="color:#003366">can now use unicode character strings.</span>

		<ul>
			<li>
				<span style="color:#003366">It is suggested to move kill icons to the lower <a href="https://en.wikipedia.org/wiki/Private_Use_Areas" rel="external nofollow">Private Use Area </a>instead of replacing existing characters.</span>
			</li>
		</ul>
	</li>
	<li>
		<span style="color:#003366">Animations for special damage types:</span>
		<ul>
			<li>
				Fixed special death animations not playing at all
			</li>
			<li>
				Added special wounded animations (animation files already exist, just weren't hooked up to code)
			</li>
		</ul>
	</li>
</ul>

<h4>
	Aug 06 2019
</h4>

<ul>
	<li>
		Added menu option to W3DViewer to toggle specular lighting
	</li>
	<li>
		Added <code>R_SPECULAR_ENABLE</code> console command to toggle specular lighting
	</li>
</ul>

<h4>
	Aug 05 2019
</h4>

<ul>
	<li>
		New weapon preset flag <code>PBReloadUninterruptable</code>, means you can't interrupt the per-bullet reload (kind of using it more like a progress indicator)
	</li>
</ul>

<h4>
	Aug 04 2019
</h4>

<ul>
	<li>
		New special damage types <code>CHEM3/4/5</code> (respectively using emitters <code>e_tib_dump_b/e_tib_dump_r/e_tib_dump</code>)
	</li>
</ul>

<h4>
	Aug 03 2019
</h4>

<ul>
	<li>
		Mammoth strings editor now supports Unicode characters everywhere (including search)
	</li>
	<li>
		Added <strong>a lot </strong>of new strings to the database that were previously hardcoded
	</li>
	<li>
		JavaScript code now supports translations via string IDs
	</li>
	<li>
		Added a mesh user text option "<code>TwoSidedLightsolve=true</code>"
		<ul>
			<li>
				Fixes problems where e.g. a two-sided fence model would be either fully light or fully dark on both sides depending on whether the <em>actual</em> front side faces the light, leading to inconsistent appearance
			</li>
			<li>
				This option causes light solve to always pick the lighter result (dynamically lit models already work 100% correctly as if they had duplicated faces)
			</li>
			<li>
				Not recommended for more "3D" meshes with multiple layers like bushes, which want to be darker on the opposite side of the light source
			</li>
		</ul>
	</li>
	<li>
		The game no longer crashes when it can't find a <code>config.dat</code> (saves which input profiles exist and which one is selected)
		<ul>
			<li>
				You should no longer need to ship <code>config.dat</code> and <code>input01.cfg</code> in the <code>data/config</code> folder
			</li>
			<li>
				The only thing you need is a <code>default_input.cfg</code> in the always.dat
			</li>
		</ul>
	</li>
	<li>
		Fixed various bugs with the input profile Save/Load/Default buttons
	</li>
</ul>

<h4>
	Jul 25-27 2019
</h4>

<ul>
	<li>
		New features for strings editor in Mammoth:
		<ul>
			<li>
				Search by numeric ID, code ID and English string
			</li>
			<li>
				Import and export tab delimited string tables
			</li>
			<li>
				<p>
					Export Category and Import Category (the first one exports all the strings in a category to a tsv file including all the translations, the second one removes the category and all the strings in it and then loads all the strings from the tsv file)
				</p>
			</li>
		</ul>
	</li>
	<li>
		<p>
			Language specific mix file support:
		</p>

		<ul>
			<li>
				<p>
					If folders named <code>french/german/spanish/chinese/japanese/korean</code> exist underneath the main leveledit folder, their contents will be exported to <code>*.dat</code> by the "export always" feature in Mammoth (artillery can also be made to export these by editing <code>artillery.json</code> and adding them in there just like you would with <code>always2.dat</code>)
				</p>
			</li>
			<li>
				<p>
					 
				</p>
				Mammoth will ignore the contents of these folders and not load their contents.
			</li>
			<li>
				<p>
					You create the folder for any languages you have and put language-specifc files (art and audio) in there. You should only put files in there that override files in the main always files and not files that dont exist in the main always files.
				</p>
			</li>
			<li>
				<p>
					When <code>strings.tdb</code> is loaded by the game, it will use the language set in the registry (<code>Language</code> key next to registry settings like <code>ClientChatLog</code> and <code>HighQualityShadows</code> with 0 = english, 1 = french, 2 = german, 3 = spanish, 4 = chinese, 5 = japanese and 6 = korean). If no translated string exists for that language it will use the English string.
				</p>
			</li>
			<li>
				<p>
					When the game starts, it will load the correct <code>.dat</code> file for the language set in the registry (should that file exist).
				</p>

				<p>
					 
				</p>
			</li>
		</ul>
	</li>
</ul>

<h4>
	Jul 22 2019
</h4>

<ul>
	<li>
		Dynamically lit two-sided faces now calculate the proper inverted normal in the shader if viewed from the "back" side so that lighting appears fully correct
	</li>
</ul>

<p>
	<span>http://tacitus.w3dhub.com/plugins/servlet/confluence/placeholder/macro?definition=e2FuY2hvcjpBUEJ9&amp;locale=en_GB&amp;version=2</span>
</p>

<h4>
	Jul 17 2019<code> - <abbr title="Red Alert: A Path Beyond">APB</abbr> 3.4.1.0</code>
</h4>

<ul>
	<li>
		<p>
			Add a new flag <code>disable_armor</code> (off by default) to <code>dp88_veterancyUnit</code>. This will disable the code to change the shield/skin of the unit and is intended for vehicles that use <code>JFW_Veteran_Armor_Deploy</code> or other scripts to manage their armor.
		</p>
	</li>
</ul>

<h4>
	Jul 15 2019
</h4>

<ul>
	<li>
		Support numeric IDs in mammoth strings editor
		<ul>
			<li>
				Removed TDBEdit.exe as it is no longer needed
			</li>
		</ul>
	</li>
</ul>

<h4>
	Jul 13 2019
</h4>

<ul>
	<li>
		<code>DamageableDoorPhys </code>can now have an Explosion instead of a sound effect.
	</li>
	<li>
		Added ability to load <code>dp88_Veterancy</code> system settings from a <code>veterancy.ini</code> file
		<ul>
			<li>
				<p>
					Example INI file:
				</p>

				<table data-macro-body-type="PLAIN_TEXT" data-macro-id="0b3ac308-5803-402a-84fe-1d974dd3fdbe" data-macro-name="code" data-macro-parameters="language=text" data-macro-schema-version="1" data-mce-resize="false">
					<tbody>
						<tr>
							<td>
								<pre>[Multipliers]
RookiePointsValue=1.0
VeteranPointsValue=1.1
ElitePointsValue=1.25

[Points]
UseCombinedPool=false
BoostPrice=1

[SwitchCharacter]
CarryOverPercent=0.6
;InfantryCarryOverPercent=0.5
;VehicleCarryOverPercent</pre>
							</td>
						</tr>
					</tbody>
				</table>

				<p>
					 
				</p>
			</li>
		</ul>
	</li>
</ul>

<h4>
	Jul 11 2019
</h4>

<ul>
	<li>
		Support for VTOL thrust vectoring for engine flames and engine rotation bones
	</li>
</ul>

<h4>
	Jul 10 2019
</h4>

<ul>
	<li>
		<code>DamageableDoorPhys</code> now supports a destruction animation and sound
	</li>
</ul>

<h4>
	Jul 08 2019
</h4>

<ul>
	<li>
		Added script MS_Destroyed_Remove_Key
	</li>
</ul>

<h4>
	Jul 07 2019
</h4>

<ul>
	<li>
		Fix players getting kicked by the anti-cheat when they connect during the score screen intermission between maps.
	</li>
	<li>
		Vehicles can now smoothly adjust their weapon barrel yaw towards their target (e.g. close vs far targets for multi-barreled vehicles)
		<ul>
			<li>
				Feature is enabled if bones named "<code>BarrelA0</code>, <code>BarrelA1</code>, ..." are found.
			</li>
			<li>
				New settings <code>WeaponYawRate/Min/Max</code>
			</li>
		</ul>
	</li>
</ul>

<h4>
	Jul 06 2019
</h4>

<ul>
	<li>
		Added <code>JFW_Spy_Beacon</code>* scripts for <abbr title="Tiberian Sun: Reborn">TSR</abbr> spy logic
	</li>
</ul>

<h4>
	Jul 05 2019
</h4>

<ul>
	<li>
		Changed the beacon explosion to do damage according to the building's armor type instead of the MCT's armor.
	</li>
	<li>
		The tabbed sidebar now has a separate tab for equipment.
	</li>
	<li>
		<p>
			Add a "moon is earth" checkbox to the "sky settings" dialog (this does the same thing as the existing <code>JFW_Moon_Is_Earth</code> script and will change the moon textures except that its easier than using the script).
		</p>
	</li>
	<li>
		<p>
			Add a menu item that reloads the per-map sky settings so you don't need to close and re-open your level every time you change the settings.
		</p>
	</li>
</ul>

<h4>
	Jul 04 2019
</h4>

<ul>
	<li>
		Added option to stop the recoil aimpoint from shifting when it reaches the top of the recoil size. This makes it more Battlefield-esque.
	</li>
</ul>

<h4>
	Jul 03 2019
</h4>

<ul>
	<li>
		The recoil resistance multiplier while you are in a scope now increases based on zoom level. At minimum zoom, it's just the amount set in the definition. At maximum zoom, the amount of resistance is doubled.
	</li>
	<li>
		<p>
			Combined the sound definition pitch settings with the ones you can set for humans and jetpacks. Both will now affect the pitch and its randomization (the former will change it each time the sound is instanced, the latter will set a fixed random offset for each human instance)
		</p>
	</li>
	<li>
		<p>
			Tweaked the recoil code and made it more customizable. Has separate resist and recovery settings again. Recovery can be turned off entirely by setting either the pattern size or the recovery strength to zero.
		</p>
	</li>
	<li>
		<p>
			Recoil resist now only counteracts the recoil impulse, it does not move aim back to the original target (see <a data-base-url="http://tacitus.w3dhub.com" data-linked-resource-default-alias="Recoil" data-linked-resource-id="5898280" data-linked-resource-type="page" data-linked-resource-version="10" href="http://tacitus.w3dhub.com/display/WH/Recoil" rel="external nofollow">Recoil</a>)
		</p>
	</li>
	<li>
		Things that squish vehicles now also squish unsquishable soldiers.
	</li>
</ul>

<h4>
	Jul 02 2019
</h4>

<ul>
	<li>
		<p>
			Added <code>CMD_Kill_Message</code> and <code>CMD_Kill_Message_Display</code> scripts. Requires a more complicated killmessage ini file:
		</p>

		<ul>
			<li>
				<code>StringFormat=KillerPlayerString,KillerString,KillString,KilledPlayerString,KilledString</code> controls what the end result of the kill message is
			</li>
			<li>
				<code>PresetXStringIDKilledString, PresetXStringIDKillString</code> and <code>PresetXStringIDKillerString</code> replace <code>PresetXStringID</code>
			</li>
			<li>
				<code>PresetXStringIDKilledString</code> is for the killed player's object, like a tank
			</li>
			<li>
				<code>PresetXStringIDKillString</code> is for a snarky message, eg " put a dozen holes in "
			</li>
			<li>
				<p>
					<code>PresetXStringIDKillerString</code> is for the killer's object
				</p>
			</li>
		</ul>
	</li>
	<li>
		<p>
			Added a "sprint multiplier" parameter to the Human physics definition, so now every definition can set a different sprint speed w.r.t their normal move speed.
		</p>

		<ul>
			<li>
				Sprinting is disabled completely if the multiplier is less than 1.0
				<p>
					 
				</p>
			</li>
		</ul>
	</li>
	<li>
		<p>
			Sprinting now supports both looping and one-shot sounds
		</p>
	</li>
	<li>
		<p>
			Moved the sound pitch factor and randomization parameters to the physics definitions (human and jetpack).
		</p>
	</li>
</ul>

<h4>
	Jun 30 2019
</h4>

<ul>
	<li>
		Added <code>R_WATCH_SHADER</code> console command to recompile all instances if a shader file changes on disk.
	</li>
	<li>
		Improved performance of shadow rendering in some circumstances, particularly with stealth units
	</li>
</ul>

<h4>
	Jun 29 2019
</h4>

<ul>
	<li>
		Added command history to the console, using the up/down arrow keys.
	</li>
</ul>

<h4>
	Jun 28 2019
</h4>

<ul>
	<li>
		Moved recoil parameters from soldier and vehicle definitions to weapons
	</li>
</ul>

<h4>
	Jun 27 2019
</h4>

<ul>
	<li>
		New medic beacon logic script: <code>JFW_Medic_Case_Beacon</code>

		<ul>
			<li>
				Deploys an AoE healing beacon when the <code>Deploy</code> keyhook is pressed
			</li>
			<li>
				Can be disabled by enemy fire
			</li>
			<li>
				Can be picked back up by the medic
			</li>
			<li>
				Is destroyed if the medic dies
			</li>
		</ul>
	</li>
</ul>

<h4>
	Jun 26 2019
</h4>

<ul>
	<li>
		Implemented lock on time for tracking weapons.
	</li>
	<li>
		<p>
			Implemented jumping sound slot for Soldiers, can be set in the human physics definition.
		</p>
	</li>
</ul>

<h4>
	Jun 25 2019
</h4>

<ul>
	<li>
		Ported vehicle squishing from <abbr title="Red Alert 2: Apocalypse Rising">AR</abbr> to 5.0
	</li>
	<li>
		Ion Storm script now also changes sky color
	</li>
	<li>
		Weapons can now have a custom weapon ready time from exiting sprint mode. If not set, it uses the default switching time as before.
	</li>
	<li>
		Fix projectiles with extensions so they don't pass through geometry if they spawn inside.
	</li>
	<li>
		Fixed bullets spawning behind the turret for certain types of vehicles.
	</li>
</ul>

<h4>
	Jun 24 2019
</h4>

<ul>
	<li>
		<p>
			Created new physics type <a data-base-url="http://tacitus.w3dhub.com" data-linked-resource-default-alias="STOVL Aircraft" data-linked-resource-id="3211513" data-linked-resource-type="page" data-linked-resource-version="9" href="http://tacitus.w3dhub.com/display/WH/STOVL+Aircraft" rel="external nofollow">STOVL Aircraft</a>, which can switch between VTOL and CTOL physics. When using this physics definition, make sure to set the vehicle type to 'CTOL Aircraft'.
		</p>

		<ul>
			<li>
				<p>
					Switching between flight modes is done using the 'drop flag' command (currently not yet bindable in the menu, can be set in <code>input01.cfg</code> with <code>DropFlag_Primary=KEYNAME</code>)
				</p>
			</li>
			<li>
				<p>
					Switching from CTOL to VTOL is only allowed if the aircraft is within a certain threshold of rotation and angular velocity (i.e is not upside down or spinning too fast)
				</p>
			</li>
		</ul>
	</li>
</ul>

<h4>
	Jun 23 2019
</h4>

<ul>
	<li>
		Added <code>DamageableDoorPhys</code>, will fully open when destroyed, then swap model (animation is not easily possible)
	</li>
	<li>
		Fixes to fog object handling for <abbr title="Red Alert: A Path Beyond">APB</abbr> (underwater vision blocker)
	</li>
	<li>
		AI harvesters can now open locked doors
	</li>
	<li>
		Ported <code>CheckCanEnterParentOnEntry</code> vehicle def setting from <abbr title="Red Alert 2: Apocalypse Rising">AR</abbr> to 5.0
		<ul>
			<li>
				Checks whether the parent object of an attached vehicle (e.g. cruiser, battle fortress) is currently being controlled by the same team before allowing a player to enter.
			</li>
			<li>
				This does <em>not</em> prevent a player from entering the attached vehicle <em>first</em> and then an enemy to "hijack" the driver's seat in the parent object.
				<ul>
					<li>
						Changed some scripts to make the following sequence fully prevent mixed teams on the same combined vehicle:<br>
						1. On the parent object, set <code>DriverEnterCustom</code> on <code>dp88_CreateAttachedObject</code> to <code>68470001</code><br>
						2. Tick <code>CheckCanEnterParentOnEntry</code> on the attached vehicle preset<br>
						3. Add <code>CMD_Eject_On_Custom</code> to the attached vehicle with <code>EjectEnemiesOnly=true </code>and<code> ToggleVehicleTransitions=false</code>
					</li>
				</ul>
			</li>
		</ul>
	</li>
	<li>
		Ported objective markers from <abbr title="Red Alert 2: Apocalypse Rising">AR</abbr> to 5.0. See <code>AR_Obj_Marker_*</code> scripts and <code>[Objective Markers]</code> <code>hud.ini</code> section.
	</li>
</ul>

<h4>
	Jun 22 2019
</h4>

<ul>
	<li>
		Added <code>RequireCrouch</code> flag for weapons
	</li>
	<li>
		Added refinery hack logic to<code> dp88_buildingScripts_functionMoneyHack</code>, distributes half of the funds to enemies
	</li>
	<li>
		Add support for a visibility blocker object to the underground script.
		<ul>
			<li>
				Create a Simple object preset with <code>DefaultPlayerVisible</code> set to false and an appropriate model and assign it to the "blocker" param of the <code>SH_UndergroundVehicle</code> script.
			</li>
			<li>
				When the script is created, the blocker object is created at the <code>Origin</code> bone of the vehicle and then attached to that bone (because of <code>DefaultPlayerVisible</code> being false the blocker object is invisible).
			</li>
			<li>
				When the script is destroyed, the blocker object is also destroyed.
			</li>
			<li>
				When the vehicle goes underground, the blocker object is made visible for all occupants of the vehicle.
			</li>
			<li>
				When the vehicle surfaces, the blocker object is made invisible for all occupants of the vehicle.
			</li>
		</ul>
	</li>
</ul>

<h4>
	Jun 20 2019
</h4>

<ul>
	<li>
		Made next/prev weapon key modify spectator speed in freelook mode. Added maximum speed to Mammoth global settings (general), defaulting to 5.
	</li>
</ul>

<h4>
	Jun 19 2019
</h4>

<ul>
	<li>
		Added script <code>JFW_Attach_Script_Custom_Until_Custom</code>
	</li>
	<li>
		<code>dp88_RegenerateHitPoints</code>: accept float interval values
	</li>
</ul>

<h4>
	Jun 14 2019
</h4>

<ul>
	<li>
		Added support for XInput gamepads (XBox controller). Left/right stick axes are hard coded to move and look, everything else can be bound to actions in the controls menu as usual.
	</li>
	<li>
		Added "toggle gunner" input to options menu because it is used by aircraft and jetpacks.
	</li>
</ul>

<h4>
	Jun 13 2019
</h4>

<ul>
	<li>
		SSGM: Simple objects with encyclopedia type "Building" get <code>SSGM_Building</code> attached
	</li>
	<li>
		Anti-Aliasing setting can now be changed while ingame and applies immediately (except in exclusive fullscreen mode!)
	</li>
	<li>
		Shader developers can now recompile all shaders from disk using the <code>RESETSHADERS</code> console command (previously crashed the game)
	</li>
</ul>

<h4>
	Jun 12 2019
</h4>

<ul>
	<li>
		Implemented ingame editing dialogue for weapon recoil parameters: <code>EDIT_RECOIL</code>
	</li>
	<li>
		<p>
			Implemented ingame editing dialogue for humans and jetpack physics: <code>EDIT_HUMAN</code>
		</p>
	</li>
	<li>
		Jetpacks:
		<ul>
			<li>
				Added engine flame support (max. 4 bones, names starting with <code>ENGINEFLAME</code>)
			</li>
			<li>
				Added fuel parameter
			</li>
			<li>
				Added flag for temporarily enabling/disabling the use of jetpacks from scripts code
			</li>
		</ul>
	</li>
</ul>

<h4>
	Jun 11 2019
</h4>

<ul>
	<li>
		EMP now affects <code>JFW_Deployable_MSA</code>.
	</li>
</ul>

<h4>
	Jun 09 2019
</h4>

<ul>
	<li>
		Flying infantry can now be locked on by tracking weapons.
	</li>
</ul>

<h4>
	Jun 08 2019
</h4>

<ul>
	<li>
		Moved vehicle turn radius parameter to wheeled vehicle physics definition (used by AI, fixes weird behavior with tracked vehicles that erroneously had non-0 turn radius set).
	</li>
</ul>

<h4>
	Jun 06 2019
</h4>

<ul>
	<li>
		<p>
			Added <code>AllowClientSpectators</code> boolean setting in tt.ini. Allows clients to use the <code>TOGGLE_SPECTATOR</code> console command on themselves (player ID not required).
		</p>
	</li>
</ul>

<h4>
	Jun 04 2019
</h4>

<ul>
	<li>
		<p>
			Added a stealth effect variant that is non-recursive, but has much better performance. Can be activated by setting <code>CheaperStealthEffect</code> to true in the object preset definition.
		</p>

		<ul>
			<li>
				<p>
					<em>Other</em> stealthed units won't be visible at all when looking through this effect, so use with care. Recommended for small and numerous objects (e.g. the <abbr title="Red Alert: A Path Beyond">APB</abbr> mines) where visual accuracy is less important and the performance impact is high.
				</p>
			</li>
		</ul>
	</li>
	<li>
		Ported a bunch of changes to JMG Utility scripts from 4.x to 5.0
	</li>
</ul>

<h4>
	Jun 03 2019
</h4>

<ul>
	<li>
		Added per-map <code>dazzle.ini</code> (<code><em>MAPNAME</em>_dazzle.ini</code>) and per-map sky textures to allow for more drastic differences in sun/moon appearance

		<ul>
			<li>
				<p>
					New sky texture settings in <code><em>MAPNAME</em>_map.ini:</code>
				</p>

				<table data-macro-body-type="PLAIN_TEXT" data-macro-id="d939b081-3b3f-4756-8968-53a6c8597a56" data-macro-name="code" data-macro-schema-version="1" data-mce-resize="false">
					<tbody>
						<tr>
							<td>
								<pre>[SkyTextures]
StarTexture=Star.tga
LightningTexture=LightningBolt.tga
LightningSource=LightningSource.tga
SunTexture=Sun.tga
SunHaloTexture=SunHalo.tga
MoonHaloTexture=MoonHalo.tga
CloudTexture=CloudLayer.tga</pre>
							</td>
						</tr>
					</tbody>
				</table>

				<p>
					 
				</p>
			</li>
		</ul>
	</li>
	<li>
		Add new surface types Blue Tiberium, Red Tiberium and Tiberium Veins for <abbr title="Tiberian Sun: Reborn">TSR</abbr>.
	</li>
	<li>
		Texture quality and filtering settings can now be changed while ingame and apply immediately
	</li>
</ul>

<h4>
	Jun 02 2019
</h4>

<ul>
	<li>
		Implemented soft flight ceiling for jetpacks
	</li>
</ul>

<h4>
	Jun 01 2019
</h4>

<ul>
	<li>
		Changed <code>JFW_EMP_New</code><span style="color:#003366"> to <em>not</em> do friendly fire</span>
	</li>
	<li>
		AI using splash against infantry will now target swimming infantry directly (splash causes them to miss)
	</li>
</ul>

<h4>
	May 31 2019
</h4>

<ul>
	<li>
		Added ability for semi-automatic ammo types (where you must click after every shot). Arthritis ho!
	</li>
	<li>
		Implemented a form of aim-assist on weapons where the ammo uses <code>AutoAdjustMuzzlesOnEnemyTarget</code>. Muzzles will be adjusted to an estimated distance for a fixed time after losing the target.
	</li>
</ul>

<h4>
	May 30 2019
</h4>

<ul>
	<li>
		Fixed weapon burst fire behavior
	</li>
	<li>
		Fixed MSAA not working on very old GPUs (D3D feature level 10.0)
	</li>
	<li>
		Added EMP effect texture support (<code>REN_emp.dds</code>), controlled by <code>JFW_EMP_New</code>
	</li>
</ul>

<h4>
	May 29 2019
</h4>

<ul>
	<li>
		Added reverse torque scaling setting to tracked vehicles (allows setting a limit on how fast they can reverse)
	</li>
	<li>
		Added <code>ION</code> console command to test the <code>Ion_Storm_New</code> script
	</li>
</ul>

<h4>
	May 28 2019
</h4>

<ul>
	<li>
		Option to clear light solve data in Mammoth (check the option, save and reload!)
	</li>
</ul>

<h4>
	May 27 2019
</h4>

<ul>
	<li>
		Moved functionality of<code> IJ_Aircraft_Landing_Gear </code>into aircraft phys definition.
	</li>
</ul>

<h4>
	May 26 2019
</h4>

<ul>
	<li>
		<p>
			Added a sprint sound option to human phys def
		</p>
	</li>
	<li>
		Added flag that tracks which team the user is on, can be accessed from JS to create per team HUDs.
	</li>
</ul>

<h4>
	May 22 2019
</h4>

<ul>
	<li>
		<p>
			Editor Combat Simulator now takes per bullet reload weapons into account.
		</p>
	</li>
	<li>
		Editor Combat Simulator now takes range (damage falloff) and whether you want to target a building's MCT into account.
	</li>
	<li>
		Added new human physics for flying infantry (<code>JetpackPhys</code>)
	</li>
</ul>

<h4>
	May 20 2019
</h4>

<ul>
	<li>
		<p>
			Added ability to dynamically set targetability (visual target boxes around object)
		</p>

		<ul>
			<li>
				<p>
					Also added ability to make a target untargetable by enemies.
				</p>
			</li>
			<li>
				<p>
					Added script for <abbr title="Red Alert: A Path Beyond">APB</abbr> to allow submarines and such to be untargetable by enemies if submerged (<code>RA_Underwater_Target_Hider</code>)
				</p>
			</li>
		</ul>
	</li>
</ul>

<h4>
	May 19 2019
</h4>

<ul>
	<li>
		Script parameters are no longer limited to 256 characters total (and won't currupt objects.ddb anymore...)
	</li>
	<li>
		Added version check to objects.ddb so that a file saved with a newer version of Mammoth will show a warning when opened with an older version of Mammoth (prevents crashes and file corruption in rare circumstances)
	</li>
</ul>

<h4>
	May 18 2019
</h4>

<ul>
	<li>
		Added <code>CMD_Supply_Truck_Miner</code> which adds a more "Generals-y" version of the miner, which can go to a docking area, drive in, collect the goods, drive out then do the same sort of thing at the refinery.

		<ul>
			<li>
				<p>
					It requires on the refinery zone and ore zone 2 waypaths each, one for entering and one for exiting. On the zones themselves (as in the actual instantiated zones), you will need to add the <code>CMD_Supply_Zone_Waypath</code> script, and put the waypath IDs for the entry and exit waypaths into it.
				</p>
			</li>
			<li>
				<p>
					Also added a new scripting command; <code>Does_Waypath_Exist</code>. Put the waypath ID in as a parameter and it will return whether it exists or not.
				</p>
			</li>
			<li>
				<p>
					Slightly shortened <code>Drive_Forwards_Into_Dump_Zone</code> into <code>Dump_Forwards</code>.
				</p>
			</li>
			<li>
				Added <code>CMD_Supply_Dropoff_Animation_Zone</code>, which allows a simple object to run an animation when a supply truck arrives at an ore zone.
			</li>
		</ul>
	</li>
	<li>
		Error log contents are now deleted on first write so we don't end up with 100s of MBs of logs after a while.
	</li>
	<li>
		Added 'Host bone offset' vector to PhysicalGameObj, and a scripts function <code>Set_Host_Bone_Offset()</code>. Makes it possible to attach an object to a bone with a fixed offset without requiring a bone.
	</li>
</ul>

<h4>
	May 15 2019
</h4>

<ul>
	<li>
		<p>
			Added extra parameter to <code>dp88_Ore_Miner: Drive_Forwards_Into_Dump_Zone</code>
		</p>
	</li>
	<li>
		Added team parameter to <code>JMG_Utility_Apply_Damage_While_In_Zone</code>
	</li>
	<li>
		Fixed the muzzle flash bug, transitions (switching camera, sniping, etc) no longer cause a muzzle flash to go off for no reason.
	</li>
</ul>

<h4>
	May 13 2019
</h4>

<ul>
	<li>
		<p>
			Added configurable Stealth on/off SoundIDs to global settings
		</p>
	</li>
</ul>

<h4>
	Mar 07 2019
</h4>

<ul>
	<li>
		<p>
			Added damage by poke script pair: <code>MS_Damage_By_Poke_Poker, MS_Damage_By_Poke_Target</code>
		</p>
	</li>
</ul>

<h4>
	May 06 2019
</h4>

<ul>
	<li>
		<p>
			Added ability to choose which vehicle types an ammotype can track. This is based on the internal type of vehicle, set on a vehicle's Settings tab.
		</p>
	</li>
</ul>

<h4>
	May 05 2019
</h4>

<ul>
	<li>
		<p>
			Added ability to visualise the projectile bounds in game with the <code>Toggle_Proj_Bounds</code> console command. NOTE: Cannot be toggled without adding <code>AllowDebugVisualisation = true</code> in <code>TT.ini</code>
		</p>
	</li>
	<li>
		Added a parameter to weapons, <code>CannotFireWithoutLock</code> which means that weapon cannot fire without a tracking lock-on (if the ammo it is trying to fire can track)
	</li>
</ul>

<p>
	 
</p>

<h4>
	Apr 21 2019<code> — <span><span><abbr title="Red Alert: A Path Beyond">APB</abbr> 3.4.0.0</span></span></code>
</h4>

<ul>
	<li>
		<p>
			Added <code>CMD_Repair_Zone_Anim</code>, which will run animations on the service depot nearest this zone (so ideally the zone that spawned it)
		</p>
	</li>
</ul>

<h4>
	Apr 18 2019
</h4>

<ul>
	<li>
		<p>
			Vehicles can now have multiple ejection ports, named under the same scheme as the muzzle bones. Eg. <code>MuzzleA0</code> should have <code>EjectA0</code>, <code>MuzzleB2</code> should have <code>EjectB2</code>, etc.
		</p>

		<ul>
			<li>
				<p>
					If the secondary fire mode is being used and the game can't find an <code>EjectB</code> bone, it'll look for the equivalent <code>EjectA</code> bone.
				</p>
			</li>
			<li>
				<p>
					If any numbered bones can't be found, it'll look for a simple <code>Eject</code> bone. If it can't find that, it won't bother.
				</p>
			</li>
		</ul>
	</li>
</ul>

<h4>
	Apr 17 2019
</h4>

<ul>
	<li>
		<p>
			Modified continuous emitters and weapon code to use a rough estimate for particle travel time (stops them from going through walls)
		</p>
	</li>
	<li>
		Merged "Gunplay" branch into 5.0, tons of new stuff available, in particular detailed recoil controls.
	</li>
</ul>

<h4>
	Mar 31 2019
</h4>

<ul>
	<li>
		<p>
			Vehicle doors now open for bots too
		</p>
	</li>
</ul>

<h4>
	Mar 20 2019
</h4>

<ul>
	<li>
		<p>
			Various improvements to dynamic lighting, now actually uses the light intensity value and is consistent with the calculations of light-solve
		</p>
	</li>
</ul>

<h4>
	Mar 16 2019
</h4>

<ul>
	<li>
		<p>
			Made <code>Ranged_Damage_To_Buildings</code> and related scripts functions use the same logic as the beacon for scaling the damage: Find the closest hit geometry polygon.
		</p>

		<ul>
			<li>
				<p>
					Previously, the building controller position was used, which caused inconsistency between nukes and demos/MADs and unintuitive behavior for large buildings
				</p>
			</li>
			<li>
				<p>
					Take note that underground geometry can be hit and might be closer to the explosion than intended!
				</p>
			</li>
		</ul>
	</li>
</ul>

<h4>
	Mar 15 2019
</h4>

<ul>
	<li>
		<strong>First public release of Max 2017 export tools!</strong>
	</li>
</ul>

<h4>
	Mar 14 2019
</h4>

<ul>
	<li>
		Implemented multiple target bones and compatibility with tracking weapons. They will lock onto the tracking bone closest to where the user is aiming. Bone names are all that start with <code>TARGET</code>.
	</li>
	<li>
		<p>
			Added specular lighting.
		</p>

		<ul>
			<li>
				<p>
					Material setup: Set specular colour in the Material Editor and shininess to a value between 1 and 1000. Lower values will cause the specular reflection to be very wide angled and diffuse, higher values will show up very tight and pinpoint.
				</p>
			</li>
			<li>
				<p>
					To enable, create a new ini called RendererFeatures.ini and put these two lines in it (also put this in the W3DViewer folder):
				</p>

				<table data-macro-body-type="PLAIN_TEXT" data-macro-id="bcdc8036-81b5-421b-bfb9-a2ab1d22705f" data-macro-name="code" data-macro-schema-version="1" data-mce-resize="false">
					<tbody>
						<tr>
							<td>
								<pre>[RendererFeatures]
SpecularEnabled=true</pre>
							</td>
						</tr>
					</tbody>
				</table>

				<p>
					 
				</p>
			</li>
		</ul>
	</li>
	<li>
		<p>
			<strong>W3DViewer</strong>
		</p>

		<ul>
			<li>
				<p>
					Display camera and poly values, animation frames and FPS.
				</p>
			</li>
			<li>
				<p>
					Implemented "Copy Screen Size To Clipboard"
				</p>
			</li>
			<li>
				<p>
					Implemented "Generate LOD"
				</p>
			</li>
			<li>
				<p>
					Implemented "Record Screen Area"
				</p>
			</li>
			<li>
				<p>
					Implement "Import Facial Anims"
				</p>
			</li>
			<li>
				<p>
					Keyboard shortcuts for animation commands:
				</p>

				<table>
					<colgroup>
						<col>
						<col>
					</colgroup>
					<tbody>
						<tr>
							<th>
								<p>
									Key
								</p>
							</th>
							<th>
								<p>
									Action
								</p>
							</th>
						</tr>
						<tr>
							<td>
								<p>
									<code>P</code>
								</p>
							</td>
							<td>
								<p>
									Play
								</p>
							</td>
						</tr>
						<tr>
							<td>
								<p>
									<code>Space</code>
								</p>
							</td>
							<td>
								<p>
									Pause/Resume
								</p>
							</td>
						</tr>
						<tr>
							<td>
								<p>
									<code>S</code>
								</p>
							</td>
							<td>
								<p>
									Stop
								</p>
							</td>
						</tr>
						<tr>
							<td>
								<p>
									<code>Left/Right Arrow</code>
								</p>
							</td>
							<td>
								<p>
									Step Back/Forwards
								</p>
							</td>
						</tr>
					</tbody>
				</table>

				<p>
					 
				</p>
			</li>
		</ul>
	</li>
</ul>

<h4>
	Mar 10 2019
</h4>

<ul>
	<li>
		"Prelit" is now a mesh flag instead of a user text addition in the new Max 2017 export tools.
	</li>
</ul>

<h4>
	Mar 08 2019
</h4>

<ul>
	<li>
		Added new physics flag <code>SmoothTurning</code> for tracked vehicles and walkers that allows them to have smoother steering.
	</li>
</ul>

<h4>
	Mar 05 2019
</h4>

<ul>
	<li>
		Allow the JS hud to use .ttf fonts. This requires setting a font name in hud.ini, as well as defining a <code>FontSize</code> for that element.
	</li>
</ul>

<h4>
	Mar 03 2019
</h4>

<ul>
	<li>
		Changed maximum client→server net update rate (<code>NUR</code>) from 30 to 75.
	</li>
</ul>

<h4>
	Feb 26 2019
</h4>

<ul>
	<li>
		Added new script <code>CMD_Eject_On_Custom</code> to force the driver and any passengers to eject from a vehicle on custom <code>68470001</code> <code>(CMD_CUSTOM_EJECT)</code>.
	</li>
</ul>

<h4>
	Feb 21 2019
</h4>

<ul>
	<li>
		Added <code>TOGGLE_SPECTATOR &lt;playerid&gt;</code> console command (host only).
	</li>
</ul>

<h4>
	Feb 18 2019
</h4>

<ul>
	<li>
		Reimplemented untrack timer for tracking weapons. Last ammo fired (primary/secondary) will be used for the tracking logic.
	</li>
</ul>

<h4>
	Feb 17 2019
</h4>

<ul>
	<li>
		Added new console command, <code>ADDWEAPONS &lt;playerid&gt;</code>. This adds all the weapons that have the flag <code>AGiveWeaponsWeapon</code> set in them. Useful for testing things.
	</li>
	<li>
		Also added the ability for ejected shotgun shells to have a different sound when they hit the ground. Use flag <code>EjectIsShotgunShell</code> in the weapon.
	</li>
</ul>

<h4>
	Feb 16 2019
</h4>

<ul>
	<li>
		Improved weather system (snow in particular):
		<ul>
			<li>
				Fixed flickering/Z-fighting for surface-aligned particles (snow that has hit the ground)
			</li>
			<li>
				Surface-aligned particles can now be seen from the other side of a window
			</li>
			<li>
				Particles outside of the view cone are skipped during render processing
			</li>
			<li>
				Maximum particle count can now be configured in <a data-base-url="http://tacitus.w3dhub.com" data-linked-resource-default-alias="tt.ini" data-linked-resource-id="721074" data-linked-resource-type="page" data-linked-resource-version="2" href="http://tacitus.w3dhub.com/display/WH/tt.ini" rel="external nofollow">tt.ini</a> (can also be set per-map using <a data-base-url="http://tacitus.w3dhub.com" data-linked-resource-default-alias="xxx_tt.ini" data-linked-resource-id="721072" data-linked-resource-type="page" data-linked-resource-version="1" href="http://tacitus.w3dhub.com/display/WH/xxx_tt.ini" rel="external nofollow">xxx_tt.ini</a>): <code>MaxWeatherParticles</code> (default <code>10000</code>)
				<ul>
					<li>
						Set with care, this can affect performance significantly at higher densities
					</li>
				</ul>
			</li>
			<li>
				Reduced performance impact of excessive density settings, but still: <em>Don't do that!</em>
				<ul>
					<li>
						Performance deteriorates when moving quickly, can also freeze the game for a bit on teleport/respawn
					</li>
					<li>
						Check whether particle count is at maximum via <code>r_stats</code> console command ingame, reduce density accordingly (maximum might not be hit exactly)
					</li>
				</ul>
			</li>
		</ul>
	</li>
	<li>
		Improved roll response of aircraft mouse steering. <a data-base-url="http://tacitus.w3dhub.com" data-linked-resource-default-alias="CTOL Aircraft" data-linked-resource-id="3211497" data-linked-resource-type="page" data-linked-resource-version="23" href="http://tacitus.w3dhub.com/display/WH/CTOL+Aircraft" rel="external nofollow">CTOL Aircraft</a> has a new parameter "Roll Auto-Leveling Anti-Wobble" that will allow you to tune the auto-leveling separately.
	</li>
	<li>
		Made aircraft lift scale down towards 0 when rolling the plane upside down instead of always working 100% towards the top of the plane
	</li>
</ul>

<h4>
	Feb 15 2019
</h4>

<ul>
	<li>
		Added active brakes for <a data-content-title="MotorVehicle" data-linked-resource-default-alias="MotorVehicle" href="#" rel="">MotorVehicle</a> physics model (used by <a data-base-url="http://tacitus.w3dhub.com" data-linked-resource-default-alias="Wheeled Vehicles" data-linked-resource-id="3211523" data-linked-resource-type="page" data-linked-resource-version="2" href="http://tacitus.w3dhub.com/display/WH/Wheeled+Vehicles" rel="external nofollow">Wheeled Vehicles</a>), new parameter <code>BrakeStrength</code>. Press crouch or jump to trigger.
	</li>
	<li>
		Fixed the sound engine not getting the correct length of pitch shifted sounds (noticeable on Jukeboxes with pitch shifted songs)
	</li>
</ul>

<h4>
	Feb 14 2019
</h4>

<ul>
	<li>
		DeadFactoryHarvesterSpawn setting on the vehicle factory now respects the SpawnDelay of the spawners
	</li>
</ul>

<h4>
	Feb 13 2019
</h4>

<ul>
	<li>
		Changed vehicle engine sound pitch shift behavior for various vehicles. VTOLs and planes now use thrust, tracked vehicles use torque.
	</li>
	<li>
		Improved "fake HDR" rendering for the sun
		<ul>
			<li>
				May require changes in dazzle.ini and/or better dazzle textures since they weren't as visible before.
			</li>
		</ul>
	</li>
</ul>

<h4>
	Feb 12 2019
</h4>

<ul>
	<li>
		<p>
			JFW_Airstrip_Reload_Zone now forces the plane to reload when it lands
		</p>
	</li>
	<li>
		Aircraft advanced controls (keyboard) now enable FollowVehicleOrientation on the camera profile so you don't have to take your hands off the keyboard (see <a data-base-url="http://tacitus.w3dhub.com" data-linked-resource-default-alias="cameras.ini" data-linked-resource-id="721085" data-linked-resource-type="page" data-linked-resource-version="18" href="http://tacitus.w3dhub.com/display/WH/cameras.ini" rel="external nofollow">cameras.ini</a>)
	</li>
	<li>
		Added command line option to specify light solve thread count in Mammoth: <code>--light-solve-threadcount X</code>
		<ul>
			<li>
				Use 1 if you consistently run into weird issues like infinite loops or light solve timeout
			</li>
			<li>
				<p>
					artillery.json can pass the argument to mammoth by adding it in the "export options" section
				</p>

				<table data-macro-body-type="PLAIN_TEXT" data-macro-id="4560312e-94af-4dc4-997c-6671e2308a9b" data-macro-name="code" data-macro-schema-version="1" data-mce-resize="false">
					<tbody>
						<tr>
							<td>
								<pre>"export_options": {
	"SOME_LEVEL.lvl": "--light-solve-threadcount 1",
},</pre>
							</td>
						</tr>
					</tbody>
				</table>

				<p>
					 
				</p>
			</li>
		</ul>
	</li>
</ul>

<h4>
	Feb 11 2019
</h4>

<ul>
	<li>
		Fixed JFW_Airstrip_Sell_Vehicle allowing more than one sale of the same vehicle if you spammed the key
	</li>
	<li>
		Improved aircraft mouse steering by implementing a PID controller
		<ul>
			<li>
				4 new tunable parameters per rotation axis (see <a data-base-url="http://tacitus.w3dhub.com" data-linked-resource-default-alias="CTOL Aircraft" data-linked-resource-id="3211497" data-linked-resource-type="page" data-linked-resource-version="23" href="http://tacitus.w3dhub.com/display/WH/CTOL+Aircraft" rel="external nofollow">CTOL Aircraft</a>, use edit_vehicles ingame)
			</li>
			<li>
				Reduces oversteering/wobbling and allows the steering to overcome potential pushback from the physics
			</li>
		</ul>
	</li>
</ul>

<h4>
	Feb 09 2019
</h4>

<ul>
	<li>
		Added facilities for ingame GPU &amp; CPU statistics. Use console command R_STATS to toggle display.
	</li>
</ul>

<h4>
	Feb 08 2019
</h4>

<ul>
	<li>
		Players can now exit planes that have safely landed anywhere on the map
	</li>
	<li>
		Added MenuPushedColor in <a data-base-url="http://tacitus.w3dhub.com" data-linked-resource-default-alias="hud.ini" data-linked-resource-id="721076" data-linked-resource-type="page" data-linked-resource-version="20" href="http://tacitus.w3dhub.com/display/WH/hud.ini" rel="external nofollow">hud.ini</a> to set the color of pushed buttons in menus
	</li>
</ul>

<h4>
	Feb 07 2019
</h4>

<ul>
	<li>
		Changed CTOL flight ceiling behavior and added three new parameters in <a data-base-url="http://tacitus.w3dhub.com" data-linked-resource-default-alias="CTOL Aircraft" data-linked-resource-id="3211497" data-linked-resource-type="page" data-linked-resource-version="23" href="http://tacitus.w3dhub.com/display/WH/CTOL+Aircraft" rel="external nofollow">CTOL Aircraft</a>: Buffer Zone, Z-Velocity Threshold and Thrust Loss
	</li>
</ul>

<h4>
	Feb 06 2019
</h4>

<ul>
	<li>
		Projectiles can now have an animation. The flag C4Animation is now ProjectileAnimation and enables it.
		<ul>
			<li>
				Export the projectile as a Hierarchical Animated Model and tick the box
			</li>
		</ul>
	</li>
	<li>
		Fixed crouch movement speed, implemented option for crouch toggling
	</li>
</ul>

<h4>
	Feb 05 2019
</h4>

<ul>
	<li>
		Weapon settings: Removed "auto-switch to last weapon when fired" logic from IsQuickCastAbility, moved it to its own setting "AutoSwitchOnFire"
	</li>
	<li>
		Fixed the ore truck never spawning again when it is destroyed before taken over by the refinery (or when WF dies while delivering and DeadFactoryHarvesterSpawn is enabled)
	</li>
</ul>

<h4>
	Feb 01 2019
</h4>

<ul>
	<li>
		Added an option to take all screenshots without the HUD regardless of whether it's globally enabled
		<ul>
			<li>
				Toggle ingame using HUD_DURING_SCREENSHOT console command (faster typing: "HUD" + Tab + Enter), also gets saved between sessions in game.cfg
			</li>
		</ul>
	</li>
</ul>

<h4>
	Jan 31 2019
</h4>

<ul>
	<li>
		Bots can now detect enemies on radar
	</li>
	<li>
		Bots can now respond to killing enemies (section <code>[EventKiller]</code> in <code>bot_config.cfg</code>, analogous to <code>[EventKilled]</code>)
	</li>
	<li>
		<p>
			Mammoth: Added buttons for testing pitch factor and pitch randomization to the "Play Sound" dialog (also fixed crash when closing this dialog)
		</p>
	</li>
	<li>
		<p>
			Mammoth: Added "Play Sound" button to the sound preset settings
		</p>
	</li>
	<li>
		Fixed weapon rate of fire timer resetting when sprinting or switching weapons. Allows weapons to have a lower switch delay than ROF interval without being abusable.
	</li>
</ul>

<h4>
	Jan 30 2019
</h4>

<ul>
	<li>
		<p>
			IJ_Aircraft_LandingZone_Aircraft now disables collision damage on aircraft within the landing zone <em>against everything except terrain</em>
		</p>
	</li>
	<li>
		Implemented crash landing for CTOL aircraft
	</li>
	<li>
		Fix ingame freezes and stuttering from superfluous shader compilation (particularly stealth shader)
	</li>
</ul>

<h4>
	Jan 27 2019
</h4>

<ul>
	<li>
		IJ_Aircraft_LandingZone_Aircraft now disables collision damage on aircraft within the landing zone
	</li>
	<li>
		Bots can now respond in chat to being killed, messages configurable via <code>bot_config.cfg </code>(which is an INI file in disguise)
		<ul>
			<li>
				New section <code>[EventKilled]</code>, entries <code>Enabled</code> <code>(int)</code>, <code>ResponseCount</code> <code>(int)</code> and <code>RespX</code> <code>(string)</code>, where <code>X</code> is an integer index
			</li>
		</ul>
	</li>
</ul>

<h4>
	Jan 26 2019
</h4>

<ul>
	<li>
		Added CollisionDamageMultiplier to vehicles, does damage on collision with any other object
	</li>
	<li>
		Improved suspension physics behavior
	</li>
	<li>
		Added separate flight ceiling setting for CTOL aircraft
	</li>
</ul>

<h4>
	Jan 25 2019
</h4>

<ul>
	<li>
		Fixed loading screen text
	</li>
	<li>
		<p>
			Decoupled weapon tracking logic from primary ammo def
		</p>

		<ul>
			<li>
				Weapons can have fully different stats for primary and secondary fire without messing up tracking.
			</li>
			<li>
				The HUD displays and targeting are calculated based on whether the player used primary or secondary fire last.
			</li>
		</ul>
	</li>
	<li>
		<p>
			Not setting a secondary ammo no longer causes a crash, No secondary ammo type means the weapon won't fire if secondary fire is pressed.
		</p>
	</li>
</ul>

<h4>
	Jan 24 2019
</h4>

<ul>
	<li>
		Added support for rotatable textures for the GraphicInterface/JavaScript UI (including an offset for the pivot)
	</li>
	<li>
		Replaced WeaponDefID and WeaponRounds in armed game objects (i.e. vehicle and soldier presets) with a list of IDs and ammo counts
		<ul>
			<li>
				Backwards compatible, i.e. weapon list will load the old values in, filling "zero" WeaponDefIDs with empty slots (can be deleted if not needed)
			</li>
			<li>
				Preset list dialogs (e.g. this, twiddlers, spawners) now support drag &amp; drop reordering and can add/edit extra data (in this case ammo counts for every weapon preset given to a character/vehicle)
			</li>
			<li>
				Ammo count can be edited via double click on the corresponding column entry, list items are now deleted via the <code>DEL</code> key
			</li>
		</ul>
	</li>
	<li>
		When switching to a camera profile with FollowVehicleOrientation enabled, automatically face forward. This makes it slightly more useful, but exiting from a vehicle still points you in a semi-random direction.
	</li>
	<li>
		New weapon preset option "DelayedChargeFire", delays firing for charging weapons until trigger is released
	</li>
</ul>

<h4>
	Jan 23 2019
</h4>

<ul>
	<li>
		Fixed sound pitch control and randomization (@devs: check all your sounds for pitch settings that until now didn't do anything!)
	</li>
	<li>
		Fixed weapon firing sounds getting cut off at high RPMs
	</li>
	<li>
		Added option for random pitch shift on vehicle engine sounds
	</li>
	<li>
		Added new weapon preset options IsQuickCastAbility and QuickCastAutoSwitchDelay, intended to be used in conjunction with IsCooldownAbility
		<ul>
			<li>
				Will fire immediately upon switching to it, then switch back to the last weapon after QuickCastAutoSwitchDelay (in seconds)
			</li>
			<li>
				Will immediately switch back to the last weapon when interrupted by entering a vehicle, getting on a ladder, etc.
			</li>
			<li>
				Cannot be selected via mouse wheel to prevent misfire, cannot be switched to at all if not ready
			</li>
			<li>
				BUG: if you have a charging QuickCast weapon out while entering a specific vehicle for the first time, the vehicle will fire once (only on FDS, involves lag and is difficult to fix)
			</li>
		</ul>
	</li>
	<li>
		Added MouseSteering_Sensitivity and MouseSteering_AggressiveTurnAngle to aircraft physics definitions
		<ul>
			<li>
				Sensitivity is a Vector3 for roll/pitch/yaw (in that order)
			</li>
			<li>
				Aggressive Turn Angle designates the angular difference threshold beyond which the mouse steering will fully roll towards the target by pointing the plane's topside towards it
			</li>
		</ul>
	</li>
</ul>

<h4>
	Jan 18 2019
</h4>

<ul>
	<li>
		Added flap movement to aircraft, using the bones <code>AILERONxxx</code>, <code>RUDDERxxx</code> and <code>ELEVATORxxx</code>
	</li>
</ul>

<h4>
	Jan 16 2019
</h4>

<ul>
	<li>
		Added FPS limiter to client, maximum read from engine.cfg (<code>MaxFPS</code>, default 300), can be set by <code>MAXFPS</code> console command

		<ul>
			<li>
				Alt+Tab was changed to not disable rendering and instead limits frame rate to 40fps
			</li>
		</ul>
	</li>
	<li>
		New mouse steering implementation for aircraft, less likely to tilt your plane down for no reason
	</li>
</ul>

<h4>
	Jan 14 2019
</h4>

<ul>
	<li>
		Added new scripts IJ_Aircraft_Landing_Gear and IJ_Aircraft_LandingZone_Aircraft
		<ul>
			<li>
				Allows manual landing gear deployment (add the name of a custom key hook to the landing gear script (e.g. "Deploy")
			</li>
			<li>
				Replace dp88_Aircraft_LandingZone_Aircraft with these two scripts, copy all parameters
			</li>
		</ul>
	</li>
	<li>
		Aircraft thrust now shows/hides the <code>EXHAUSTxxx</code> bones of the model
	</li>
	<li>
		Added an InfantryOnly parameter to script zones (if both InfantryOnly and VehicleOnly are checked, either class can activate it)
	</li>
</ul>

<h4>
	Jan 13 2019
</h4>

<ul>
	<li>
		Implemented soft flight ceiling for CTOL aircraft
	</li>
	<li>
		Fix to make model-based script zones work if not placed at 0,0,0
	</li>
	<li>
		Fixed dazzles not appearing
	</li>
	<li>
		Added a VehiclesOnly parameter to script zones
	</li>
</ul>

<h4>
	Jan 12 2019
</h4>

<ul>
	<li>
		<p>
			Added placeholder HUD for CTOL aircraft
		</p>
	</li>
	<li>
		<p>
			Added CameraBone and DisableFloatingPlayerName parameter to cameras.ini. See documentation: <a data-base-url="http://tacitus.w3dhub.com" data-linked-resource-default-alias="cameras.ini" data-linked-resource-id="721085" data-linked-resource-type="page" data-linked-resource-version="18" href="http://tacitus.w3dhub.com/display/WH/cameras.ini" rel="external nofollow">cameras.ini</a>.
		</p>
	</li>
</ul>

<h4>
	Jan 11 2019
</h4>

<ul>
	<li>
		<p>
			Added edit_camera console command to modify camera profiles (does not write to ini file, like edit_vehicles)
		</p>
	</li>
	<li>
		<p>
			Added MaxCruisingSpeed parameter to aircraft presets
		</p>
	</li>
</ul>

<h4>
	Jan 8 2019
</h4>

<ul>
	<li>
		<p>
			JFW<em>_</em>Airstrip_Repair_Vehicle now autostarts instead of waiting for a key press
		</p>
	</li>
	<li>
		<p>
			MS_Jukebox new parameters:
		</p>

		<ul>
			<li>
				<code>Delay</code> delays the first song by x seconds
			</li>
			<li>
				<code>FirstSong</code> forces the first song in the playlist to be played first instead of it being random
			</li>
		</ul>
	</li>
</ul>

<h4>
	Jan 5 2019
</h4>

<ul>
	<li>
		<p>
			Added repair delay to JFW_Airstrip_Repair_Zone<em>/</em>JFW_Airstrip_Repair_Vehicle
		</p>
	</li>
</ul>

<h4>
	Dec 31 2018
</h4>

<ul>
	<li>
		Bots now dynamically change roles from offensive to defensive on demand as respective defensive/engineering objectives appear/disappear (first 3 bots used to be forced to always be defenders/engineers)
	</li>
</ul>

<h4>
	Dec 29 2018
</h4>

<ul>
	<li>
		Add new flag <code>NoLoop</code> to MS_Jukebox, plays only the first song and then stops
	</li>
</ul>

<h4>
	Dec 28 2018
</h4>

<ul>
	<li>
		<p>
			Added the ability to add loading screen music on a global and per map basis.
		</p>

		<ul>
			<li>
				<p>
					Uses LoadingMusic key in tt.ini (for global) and in [mapname]_map.ini for per map basis. Fades out after loading is complete in 1 second.
				</p>
			</li>
		</ul>
	</li>
	<li>
		<p>
			Added MS_Jukebox script for sound objects, references a Twiddler that contains the list of music tracks to play
		</p>
	</li>
	<li>
		Bots now grab their vehicles faster and leave less vehicles crowding at the WF (mostly affects <abbr title="Red Alert: A Path Beyond">APB</abbr> bots)
	</li>
</ul>

<h4>
	Dec 26 2018
</h4>

<ul>
	<li>
		<p>
			Added ability to point filter textures. Controlled via TextureManager.ini.
		</p>
	</li>
</ul>

<h4>
	Dec 24 2018
</h4>

<ul>
	<li>
		Fix so pre-placed vehicles dont crash
	</li>
</ul>

<h4>
	Dec 23 2018
</h4>

<ul>
	<li>
		<p>
			Added a parameterised repair delay to JFW_Repair_Zone_2, as well as 2 versions for <abbr title="Red Alert: A Path Beyond">APB</abbr> that have Boats/Non-boats filtering.
		</p>
	</li>
	<li>
		<p>
			Added a safety timeout to Mammoth light solve due to a deadlock bug with unknown causes and solutions
		</p>
	</li>
	<li>
		<p>
			Added a progress bar and a few printouts to Mammoth batch mode (needs updated artillery)
		</p>
	</li>
</ul>

<h4>
	Dec 20 2018
</h4>

<ul>
	<li>
		New Aircraft physics model!
	</li>
</ul>

<h4>
	Dec 19 2018
</h4>

<ul>
	<li>
		<p>
			Fix fullscreen mode when DPI scaling is active on Windows 10
		</p>
	</li>
	<li>
		<p>
			MouseSteering VTOLs now strafe by default
		</p>
	</li>
</ul>

<h4>
	Dec 13 2018
</h4>

<ul>
	<li>
		<p>
			changed settings to enable mouse steering without forward movement
		</p>
	</li>
</ul>

<h4>
	Dec 12 2018
</h4>

<ul>
	<li>
		<p>
			Added weapon preset option <code>CooldownAbility</code> to always reload on a fixed cooldown, even if not currently held. The cooldown is equal to the reload time and starts as soon as the current clip is non-empty.
		</p>
	</li>
</ul>

<h4>
	Dec 9 2018
</h4>

<ul>
	<li>
		<p>
			Enabled texture quality setting
		</p>

		<ul>
			<li>
				<p>
					Menu and loading screen backgrounds are loaded just like ingame models, so they <em>must</em> have no mipmaps to not be affected by texture quality (other UI textures still waste space if they have mipmaps, but it won't cause visual issues)
				</p>
			</li>
		</ul>
	</li>
</ul>

<h4>
	Dec 7 2018
</h4>

<ul>
	<li>
		<p>
			Made several logging facilities use a separate thread to write to disk (reduces stutter, especially with active anti-virus programs running)
		</p>

		<ul>
			<li>
				<p>
					Client chat log, server console log, anti-cheat log, engine diagnostics
				</p>
			</li>
		</ul>
	</li>
	<li>
		<p>
			Converted client chat log to UTF-8, unicode character messages aren't just empty now
		</p>
	</li>
</ul>

<h4>
	Dec 6 2018
</h4>

<ul>
	<li>
		<p>
			New scripts JFW_Tint_Controller and JFW_Water_Tint_Zone
		</p>
	</li>
</ul>

<h4>
	Dec 3 2018
</h4>

<ul>
	<li>
		<p>
			Added FollowVehicleOrientation parameter to cameras.ini. See documentation: <a data-base-url="http://tacitus.w3dhub.com" data-linked-resource-default-alias="cameras.ini" data-linked-resource-id="721085" data-linked-resource-type="page" data-linked-resource-version="18" href="http://tacitus.w3dhub.com/display/WH/cameras.ini" rel="external nofollow">cameras.ini</a>.
		</p>
	</li>
</ul>

<h4>
	Dec 2 2018
</h4>

<ul>
	<li>
		<p>
			Multi-file drag-drop in w3dviewer
		</p>
	</li>
</ul>

<h4>
	Dec 1 2018
</h4>

<ul>
	<li>
		Remove "Generate LOD" from w3dviewer as no-one seems to need it at this point and finishing the implementation is a fair bit of work. If it (or any of the other w3dview features I decided not to support) turns out to be useful we can go back and implement it later)
	</li>
</ul>

<h4>
	Nov 30 2018<code> — <span><span><abbr title="Red Alert: A Path Beyond">APB</abbr> 3.3.1.x</span></span></code>
</h4>

<ul>
	<li>
		Fix Mammoth pathfind generation for doors
	</li>
</ul>
]]></description><guid isPermaLink="false">5</guid><pubDate>Mon, 17 Jan 2022 20:33:57 +0000</pubDate></item><item><title>A History of the Custom Scripts.dll</title><link>https://w3dhub.com/forum/documentation/articles/a-history-of-the-custom-scriptsdll-r6/</link><description><![CDATA[<h1>
	Introduction
</h1>

<table data-macro-body-type="RICH_TEXT" data-macro-id="518cae04-7978-4a16-a289-f3df77854687" data-macro-name="info" data-macro-schema-version="1" data-mce-resize="false">
	<tbody>
		<tr>
			<td>
				<p>
					This Article is by Jonathan Wilson, Lead Programmer at Tiberian Technologies and Head of Scripts.dll Development 
				</p>
			</td>
		</tr>
	</tbody>
</table>

<p>
	 
</p>

<p>
	Before I start the story of scripts.dll, let me say that I have been involved with modding for the C&amp;C series since the beginning. I was the first person to figure out the RLE compression used for the .shp files of Tiberian Sun and I spent many hours in the debugger extracting filenames for the old games (anyone who knows how the old games worked will know that they didn't store filenames in the mix files and the community had to figure out the correct filename for all the files in each mix file).
</p>

<h1>
	Origins
</h1>

<p>
	The scripts.dll story begins when the mod tools came out.
</p>

<p>
	When they came out I started fiddling with them and pulling the game and tools apart to see how they worked (as I had done with previous games).
</p>

<p>
	 
</p>

<p>
	I wrote a number of things back then including a fairly primitive W3D viewer (I still remember asking Greg Hjelstrom a LOT of questions to fill in the gaps in the knowledge of the w3d file format).
</p>

<p>
	 
</p>

<p>
	In terms of scripts.dll and its history, I did 3 things at that point. Firstly, I was involved (with a few others from memory) in convincing Greg to write a few rather useful scripts and include them in one of the later patches to Renegade. (these are the scripts that start with GTH).
</p>

<p>
	 Secondly, I was involved in an effort to convince EA to release (to the public) the source code to the scripts.dll (not the engine itself, just the scripts.dll) to allow people to write their own gameplay scripts. This didn't happen (despite a fairly well-supported online petition) mostly because EA was concerned about the code being abused (malware etc).
</p>

<p>
	 
</p>

<p>
	And thirdly I was pulling the scripts.dll apart to figure out how it worked and what various of the scripts actually did. The first result of this was a tool called "scripts test" that simply dumped a list of all the scripts in the scripts.dll.
</p>

<p>
	 
</p>

<p>
	Other than the leveledit debug strings I found (and what I was able to figure out from reverse engineering and testing) I did also make use of a bunch of info given to me by Greg Hjelsrom at various points (I wont go into details since I don't have all the relavent emails etc handy and I probably should say too much in public anyway but lets just say that info was vital to getting things to work in those early days.)
</p>

<p>
	 
</p>

<p>
	My memory is a little hazy as to when I first decided to start writing my own gameplay scripts but the first official release came out on the 20th of August 2002 and was named version 0.9 beta. According to the old readme file I found (the only part of 0.9 beta I still have), version 0.9 beta contained 3 scripts named JFW_Spawn_Object_Death,JFW_Create_Objective_Death and JFW_Update_Objective_Death. JFW_Spawn_Object_Death (the first script I ever wrote) is still in the scripts.dll even today (and what the script does hasn't changed in all that time). The reverse engineering work at that time was (from memory) mostly done with various versions of IDA Pro (I forget if I was still using SoftIce for Renegade or not) and all the code was being written with Visual Studio 6.0.
</p>

<p>
	 
</p>

<p>
	That was quickly followed by 0.91 beta, 0.92 beta, 0.93 beta, 0.94 beta, 0.95 beta, 0.96 RC, 0.97 RC, 0.98 RC, 0.99 RC, 1.0 RC1 and then 1.0 RC2 (the oldest version I still have on my disk). Work continued on figuring out the internals of scripts.dll and the way scripts.dll talked to the engine (to expand what scripts.dll could do). By the time 1.0 RC2 hit, I had discovered a new source of information in the form of debug strings in the Renegade level editor. This gave us (the people working on scripts.dll at the time) the names of a bunch of things in the engine (including lots of the script commands).
</p>

<p>
	 
</p>

<p>
	Most of the work at this point was done by myself, Dante and Sir_Kane although some scripts had also been written by NameHunter. 1.0RC2 contains somewhere around 80 scripts or so, mostly written by me but also a few by NameHunter and Dante. Highlights include the first construction yard scripts,the beginnings of AI scripting and some nice utility functions including the first functions for sending a custom on zone entry.
</p>

<p>
	 
</p>

<p>
	The next part will cover the rest of the 1.x series (I no longer have copies of 1.0 final, 1.1, 1.1.1, 1.2 or 1.3 but I have all scripts versions from 1.3.1 through to 1.9.3 and will be able to talk more about what changed through those versions)
</p>

<h1>
	Scripts 1.x
</h1>

<h2>
	Scripts 1.0-1.9
</h2>

<p>
	After 1.0 RC2 came 1.0 final (which I no longer have) then 1.1.
</p>

<p>
	I still have an incomplete copy of a build labeled "1.1" in the readme file (although I dont know exactly what build it is, whether its 1.1 or 1.1.1 or something in between builds or what)
</p>

<p>
	 The big change in 1.1 was the discovery of a complete symbol table in the Linux FDS (in layman's terms its a list of all the functions in the executable file with their names and definitions). Discovering this allowed me to completly rewrite the code to be a lot more like the original Westwood way of doing things. Too many changes between 1.0 RC2 and the code I have labeled 1.1 for me to go into any more detail.
</p>

<p>
	 
</p>

<p>
	Then after 1.1 came 1.1.1, 1.2, 1.3 and then 1.3.1 (the next build I still have)
</p>

<p>
	In the time between the 1.1 code I have and the 1.3.1 release, work continued on reverse engineering the engine and I continued to write scripts to do cool stuff (and to take advantage of any new engine discoveries I made). NameHunter wrote more scripts and the first scripts for Reborn (not sure who wrote these early scripts) and RenAlert (written by Dante) were written. Also some scripts for something called Survival (not sure what this was or who wrote these early scripts) got written.
</p>

<p>
	 
</p>

<p>
	1.4 continued the general improvements along with more new scripts by me. This also marked the start of some scripts being written by Vloktboky. Further additions were made to the Reborn scripts (not sure by who) and the RenAlert scripts (this marked the beginning of work on RenAlert scripts by NeoSaber)
</p>

<p>
	 
</p>

<p>
	New in 1.5 was support for the Linux FDS thanks to Datalore (who did a great job of dealing with the funky way GCC does inline assembler and the other Linux-specific weirdness). Also new in 1.5 was a refactoring of some core code to be closer to how the real thing is laid out along with more engine research and general improvements. New scripts were written by Vloktboky and myself.
</p>

<p>
	1.6 had more scripts by me, more cleanups, more scripts by Vloktboky, a couple new scripts by NameHunter and some new RenAlert scripts by NeoSaber. It also introduced some scripts for a mod called <abbr title="Red Alert 2"><abbr title="Red Alert 2">RA2</abbr></abbr> Vengeance.
</p>

<p>
	 
</p>

<p>
	1.7 had still more cleanups and engine research, more scripts by me (including the cloning of a bunch of interesting stock scripts), more scripts by NeoSaber (both for RenAlert and otherwise), some new scripts from TimeFX and a bunch of scripts from E! for a Generals mod called SCUD Storm.
</p>

<p>
	 
</p>

<p>
	In 1.7.1, the big change was a move from Visual C++ 6 to Visual C++ .NET 2003. Cleanups and engine research continued although this build contained no new scripts.
</p>

<p>
	 
</p>

<p>
	1.8 introduced the first engine calls (with a LOT of hacks involved). Cleanups and general engine research also continued. More scripts for Scud Storm, RenAlert and RA2Vengeance were added along with new scripts by me.(including more clones of stock scripts). One of the engine calls introduced in this first batch was the first engine call to use the special "debug fly" flying infantry logic westwood left in the game.
</p>

<p>
	 
</p>

<p>
	Scripts 1.9 was a major milestone with the first engine hacks being added. New console commands were added. Various engine calls were fixed to work over the network including animation, stealth, explosions, audio and poke. Exported engine functions were made available to do per-player screen fade and player terminal display. Fixes, cleanups and engine research continued as usual. More engine calls were added to engine.cpp including console input and output calls. New scripts were added by me along with new RenAlert scripts from NeoSaber.
</p>

<p>
	 
</p>

<p>
	1.9.1 was just some bug fixes on top of 1.9.
</p>

<p>
	1.9.2 was more bug fixes on top of 1.9.1.
</p>

<p>
	1.9.3 was just a bug fix on top of 1.9.2.
</p>

<h1>
	Scripts 2.x
</h1>

<h2>
	Scripts 2.0 - 2.1
</h2>

<p>
	2.0 was released around xmas of 2004 and by this time the Blackhand Studios development group was well established and quite a few other people also worked on engine work besides me  (I dont plan to cover things like RenGuard or the Core Patches in this history series, nor do I plan to cover things written by other people like brenbot, the old pre-4.x SSAOW/SSGM/SSCTF stuff, Dragonade or Renegade Resurrection)
</p>

<p>
	 
</p>

<p>
	In 2.0, a number of script commands were made to work correctly in multiplayer including screen fade. Per-player commands were added for playing audio and some other things. The first commands to display messages on the client were added in 2.0 as well. Various other bhs.dll fixes were made including making Set_Model work correctly over the network for vehicles and infantry and stuff and making the harvesting arms of the tiberium harvester animate when its harvesting. A fix was also added for granting weapons to vehicles and changing the weapon of a vehicle. More console commands also got added.
</p>

<p>
	 
</p>

<p>
	New engine calls got added to engine.cpp including engine calls to remove scripts from an object, get the occupants of vehicles, get the weapon an object is using, get the hierarchy/skeleton name of an object, get the "sex" of an object (so you can use the correct infantry animation set) and kick the occupants out of a vehicle.
</p>

<p>
	 
</p>

<p>
	Some scripts were written by Dan, Vloktboky and myself along with an AI script from NeoSaber. General cleanups/fixes and engine research continued as usual. TheKGBSpy wrote more scripts for <abbr title="Red Alert 2"><abbr title="Red Alert 2">RA2</abbr></abbr> Vengeance. Due to some crap going on at the time that I wont go into, RenAlert wasn't shipping newer scripts builds or bhs.dll at the time but instead shipping their own thing (I will not be discussing the details of what was going on at the time since its long since over, all the people involved have left the community AFAIK, all the "secret" scripts were eventually published and all the engine know-how the relavent people were hoarding has long since been figured out)
</p>

<p>
	2.0.1 followed soon after and fixed a couple of bugs.
</p>

<p>
	 
</p>

<p>
	Then came scripts 2.1. 2.1 added more new console commands. 2.1 also introduced code to output screenshots in .png format instead of the default .tga format. A hack was introduced that made maps load much faster but (unbeknownst to me at the time) made things load a lot slower in-game by disabling some code to pre-load and parse a bunch of w3d files on map load. The object create hook system was added in 2.1, as was the custom key hooks and the first version of the custom sniper scope code. Extra log files started to be created to log all sorts of messages (the details of why we started creating these log files is lost in the mists of time). The chat hook was first introduced in 2.1 as well as was a fix for the invisible harvester bug with airstrips. A fix was added to make the infantry death sound and powerup collection sound play in multiplayer. An engine call was added to get the version of bhs.dll.
</p>

<p>
	 
</p>

<p>
	Engine research and general fixes/improvements/cleanups also continued in 2.1. Engine calls were added to access the cGameData instance among other engine calls.By this time we had figured out the initial definitions of classes in Renegade including cGameData and WeaponBagClass as well as utility classes like Vector4, Matrix3D, SList, SimpleVecClass, SimpleDynVecClass, VectorClass and DynamicVectorClass. I wrote more scripts including clones of all the "secret" scripts RenAlert was using at the time (and at that point was refusing to share). The first scripts to be written by scripts contributor and later engine guru Saberhawk got added in 2.1 as well.
</p>

<p>
	2.1.1 and 2.1.2 were just bug fixes on top of 2.1 to fix some issues with the AGT scripts.
</p>

<p>
	 
</p>

<p>
	2.1.3 added some stuff to disable some of the logging on the client (since some people didn't want those logs). It also featured code cleanup and improvements and bug fixes and the first efforts to block specific "bad" nicknames (e.g. nickname too long, nickname containing bad characters etc). Code was also added to disable certain netcode that could be used to cheat.
</p>

<p>
	 
</p>

<h2>
	Scripts 2.2
</h2>

<p>
	After 2.1.3 came 2.2 which was a big release.
</p>

<p>
	 
</p>

<p>
	In 2.2, all of my scripts were re-organized into new source files divided up based on what sort of script it was (e.g. sounds, weapons, cinematics, vehicles, powerups, script zones etc). The usual cleanups, bug fixing and engine reverse engineering continued. New engine calls were added including the first engine call for changing the spawn character. Reborn got the first scripts for walkers/mecha and some new deployable vehicle stuff. I wrote some new scripts as well.
</p>

<p>
	 
</p>

<p>
	bhs.dll got a lot of improvements. Lots of work went into bug fixing, fixing crashes etc. 2.2 introduced the new crashdump code where the code to emit _except.txt when crashes happened was ripped out and replaced with new code to spit out a crashdump.txt with more info than _except.txt had. This made debugging crashes much easier. The chat hook was modified to support unicode messages (important for players using foreign language characters like Ã¶ in their chat strings). A hook was added to allow you to listen to "host messages" (i.e. messages sent from the server in various ways).
</p>

<p>
	 
</p>

<p>
	Scripts 2.2 was quickly followed up by scripts 2.2.1 and then 2.2.2. Both versions contained only bug fixes on top of 2.2.
</p>

<p>
	 
</p>

<p>
	Around the same time as scripts 2.2 came out, I also released a hacked improved version of leveledit (numbered 1.0.0.4) that fixed a bunch of bugs. Highlights of this release included making it read scripts.dll/scripts2.dll from the Renegade folder (no more need to copy them to the mod folder), fixing some crashes, adding the "export to mix" menu option to the menus (the logic was already there, it just needed to be made visible), displaying the current mod package name on the status bar and properly reading the game data files (including always2.dat). 1.0.0.4 no longer had problems when placing certain objects like multiplayer helicopters.
</p>

<p>
	 
</p>

<h2>
	Scripts 2.3-2.4
</h2>

<p>
	Scripts 2.3 hit in January of 2006. It featured the usual bug fixes, cleanups and engine research. It also added some stuff to make Set_Obj_Radar_Blip_Shape and Set_Obj_Radar_Blip_Color work over the network. Code was added to include the Windows version and the date and time in crashdump.txt files. An engine call was added to let you switch to a different main hud texture at runtime. Improvements were made to the keyhook stuff. More scripts were written by me. WhiteDragon also wrote some scripts and some stuff was added for Reborn.
</p>

<p>
	 
</p>

<p>
	Scripts 2.3.1 then followed soon after with a few bug fixes.
</p>

<p>
	 
</p>

<p>
	After that came scripts 2.4 a few months later.
</p>

<p>
	 
</p>

<p>
	2.4 added some console commands to set and get the bandwidth for a player. The player join hook, load level hook and game over hook were added. The first hud.ini stuff was added (changing the colors used for the teams in chat etc). Engine calls were added to identify if running on Linux vs Windows and Dedicated server vs game client along with a way to identify the current game mode (WOL vs gamespy vs lan vs etc) and a couple of others.
</p>

<p>
	 
</p>

<p>
	The usual scripts cleanup, bug fixing and engine research also happened for 2.4 along with some new scripts by me. The split between the RenAlert guys and myself went away and all the secret stuff stopped. My reverse engineered clones of the formerly-closed-source scripts were removed and replaced with the real thing thanks to NeoSaber.
</p>

<p>
	 
</p>

<p>
	The "secret" scripts stuff was basically some stuff that for whatever reason the RenAlert guys didn't want to share. It had the missile silo scripts, CanyonRiver and Metro scripts, underwater stuff, submarine script and vehicle script. I dont want to go into details of the whole fight over the issue (and over the various engine related things that the "secret" scripts made use of) so this is all I will say on the matter.
</p>

<h2>
	 
</h2>

<h2>
	Scripts 2.5-2.6
</h2>

<p>
	2.5 came out next and added a special console command and a few other things for the Linux FDS and some WOL stuff people were doing at the time. Code was added to disable the GameSpy serial number check (the GameSpy serial number database was missing serials from The First Decade so TFD players were unable to play on GameSpy without this change).
</p>

<p>
	 
</p>

<p>
	More cleanups, fixes and engine research happened as well along with the addition of some engine calls for getting information from players (current money, current score, things like that) although no new scripts were added in 2.5.
</p>

<p>
	2.5.1 came out soon afterwards and fixed a bug with some things in 2.5 then 2.5.2 fixed more things.
</p>

<p>
	 
</p>

<p>
	Next came scripts 2.6. The usual cleanups and fixes and engine research continued, as did some new console commands for changing the vehicle limit as well as the commands for sending messages to the client and having them appear in the chat box alongside messages like "unit ready". Display_Health_Bar was made to work over the network as well as entries in hud.ini to let you change the public and private message colors. Per-player radar blip shape engine calls were added at this point along with engine calls for vehicle limit and message sending.
</p>

<p>
	 
</p>

<p>
	A bunch of new engine calls were added to engine.h including the first engine calls that worked with strings from strings.tdb. A bunch of new scripts got added by me.
</p>

<p>
	 
</p>

<h2>
	Scripts 2.7
</h2>

<p>
	Scripts 2.7 again had the usual bug fixes/cleanups/engine enhancements.
</p>

<p>
	 
</p>

<p>
	Console commands were added to disarm C4 and beacons for a player along with some more stuff for LFDS WOL work. The Disable_All_Collisions, Disable_Physical_Collisions and Enable_Collisions engine calls were made to work over the network. A hook that gets triggered any time a player sends their version to the server was added along with a Set_Wireframe_Mode engine call and some work on an engine call for removing a weapon from a player. The first attempt at code to let you change the PT data at runtime was also added.
</p>

<p>
	 
</p>

<p>
	2.7 also marked the introduction of the first custom HUD code with large parts of the HUD (health/shield bar, time, credits, radar, weapons and other things) being customizable. Engine calls were added to engine.cpp for getting/setting the current ammo for weapons in various ways, disarming beacons and working with the PT data. 2.7 was the first version to expose the ini reading functionality to scripts.dll so people could use it to read and write ini files (instead of whatever code they had been using previously). I wrote some new scripts as did WhiteDragon.
</p>

<p>
	 
</p>

<p>
	2.7.1 followed 2.7 and contained bug fixes.
</p>

<p>
	 
</p>

<p>
	Then 2.7.2 followed 2.7.1 with more bug fixes.
</p>

<p>
	 
</p>

<h2>
	Scripts 2.8-2.9
</h2>

<p>
	2.8 had more bug fixes/cleanups/engine research. It introduced per-player fog commands, Improvements were made to the code for sending the PT data changes over the network. Improvements were made to the custom HUD logic. New hud.ini keywords were added to let you change the cost and time multipliers that apply when the power is down, to disable the "locked to the player who bought it" logic, enable the use of the "hidden" PT pages globally and enable some special logic for purchasing. Fixes were made to try and stop certain server exploits. A change was made to make disabling the radar work better. Hooks were added for powerup purchase, vehicle purchase and character purchase as well as hooks for monitoring those purchase types (used if you just want to log things rather than actually change how the purchasing happens).
</p>

<p>
	 
</p>

<p>
	Engine calls were added to get the build time multiplier (i.e. the value used to increase the build time when the power plant goes down), change some settings related to the scrolling radar map feature, set/get a flag that will display "building" for vehicle buttons (used as part of various scripts that I will get to later). Code was added to send everything that would be written to the console through a UDP packet (intended so you can have something such as a server bot catch it and do stuff with it and not need to parse log files for the same info).
</p>

<p>
	The first definitions of the classes NetworkObjectClass, OBBoxClass and BaseControllerClass were added. Engine calls were added to turn the base power off/on, toggle the base radar, find buildings of different types, identify if a map is a flying map (i.e. if the checkbox in LE is ticked), do things with script zones and some other stuff. I wrote some new scripts and some scripts written by Kamuix were added. Some new scripts written by WhiteDragon were also added including the first version of the ExpVehFac stuff for creating working naval yards and helipads where you buy stuff directly from the regular PTs
</p>

<p>
	After 2.8 came 2.9.
</p>

<p>
	 
</p>

<p>
	2.9 included the usual cleanups/fixes/engine research along with new scripts by me. WhiteDragon wrote one new script. Engine calls were added to get the type and size of a script zone, to create a script zone at runtime and to identify if a given xyz coordinate is inside a given script zone. Console commands to change the player limit and time values were added. A new hud.ini keyword was added to turn off some code related to the disabling of the "vehicle" button when a vehicle is building. Hud.ini keywords were added to change a bunch of colors related to the UI as well as to disable the glow around the large menu item text icons. Hud.ini keywords were added to allow you to make certain units unsquishable and change certain things associated with the stealth texture. The first version of the sidebar logic also appeared in 2.9. A hook to grab all the console output was added along with a way to change the reticle textures for a given client at runtime. Engine calls to do things related to fog got added along with various ways to change the player limit. A fix got added for a glitch with the "start" button when connecting to XWIS/WOL and a hook to let you do special checks of hud.ini to prevent modifications for cheat purposes (the forerunner to the current scripts anti-cheat code). A new dialog box to display the chat history was added (since the sidebar doesn't have an inbuilt chat history like the PTs do)
</p>

<p>
	 
</p>

<p>
	2.9.1 followed up with some bug fixes and then 2.9.2 came after that with more bug fixes as well as some changes to prevent people mixing incompatible versions of scripts.dll and bhs.dll (e.g. trying to use a newer bhs.dll with an older SSAOW or similar)
</p>

<h1>
	Scripts 3.x
</h1>

<h2>
	Scripts 3.0
</h2>

<p>
	3.0 was the first release to include the massive graphics enhancement that was shaders.dll. Saberhawk contributed a lot of the graphics code to this release and StealthEye did work on the netcode. This was the first version built using Visual C++ 2005.
</p>

<p>
	 
</p>

<p>
	Console commands to display a w3d file in-game and to turn off the HUD were added. More information was added to crashdump.txt. Improvements were made to the custom hud code. More colors related to the UI became customizable. Purchase sounds were added to the sidebar. A fix was added for vehicles getting stuck near ladders (including aircraft flying over them). A player leave hook was finally added. "wall lag" was fixed. C4 objects now triggered scripts attached to them properly. Turret lag was fixed. The first version of the "extended options" dialog got added (to allow in-game setting of various scripts.dll options). An engine call was added to trigger the "you aren't allowed to use this dialog" (like you get when you use an enemy PT).
</p>

<p>
	 
</p>

<p>
	Renegade was updated to detect more video cards and driver versions. 3.0 was the first version that moved Renegade so it was using Direct3D9 instead of Direct3D8. The shadow quality was improved. Programmable shader stuff was added including a normal mapping shader, a glass effect shader, a glow shader and some post-processing shaders. The usual scripts cleanups/fixes/engine research continued. A lot more classes in the game had their definition figured out or expanded/fleshed out (including for the first time, several of the GameObject classes). Engine calls were written to open a file (such that it would read from the mix files or data folder as appropriate), access weapon and ammo definitions and do some other stuff.
</p>

<p>
	 
</p>

<p>
	The first scripts for the RenAlert gap generators were added in 3.0 along with some other scripts for that mod. A clone of the Test_Cinematic script was added and I wrote several other new scripts. Kamuix wrote some more scripts as did WhiteDragon. Saberhawk wrote one new script. Work was done to make sure the scripts compiled with Visual C++ 2005 Express (the free version)
</p>

<p>
	 
</p>

<h2>
	Scripts 3.1
</h2>

<p>
	Scripts 3.1 came out shortly before xmas of 2006 and contained a lot of bug fixes, cleanups and engine research. The "vsync" feature was added. I wrote some new scripts. Stuff got added to do different things with shaders and scopes. 3.1 may not sound like a big release but a lot of bug fixing and cleanup went into it to try and solve as many of the "3.0 sucks" complaints that were happening on renforums at the time.
</p>

<p>
	 
</p>

<p>
	3.1.1 followed soon after with a bunch more bug fixes and cleanups then 3.1.2 soon after with more fixes. Work continued on solving all the crashes and glitches people were reporting. A lot of the problems people had with the 3.x released turned out to be crappy graphics drivers, having shaders enabled on cards that just couldn't handle them properly or using the example shader databases in ways they weren't intended for.
</p>

<p>
	 
</p>

<p>
	3.1.3 came out next and had more bug fixes and cleanups. Then 3.1.4 followed (which was 3.1.3 with bhs.dll from 3.1.2 since I was unable to release a new bhs.dll at the time)
</p>

<p>
	 
</p>

<p>
	Then came 3.2 with even more bug fixes, cleanups and engine research. The graphics system continued to be improved and fixed. 3.2 also improved the generation of crashdump files so it wold keep multiple dumps around. Improvements were made to the unsquishable logic and a hud.ini keyword was added to let you disable the standard kill messages. Extra debug logging was added to the d3d9 code. Lots of shader work was done. "post process" shaders were renamed scene shaders. Some new memory leak detection code was added to the scripts.dll and a lot of memory leaks fixed (including memory leaks that existed in the stock game). Multi-sample anti-aliasing was added. An engine call was added to help you identify what object caused an explosion when one happens (i.e. beacon/c4 explosions). A bunch of classes were mapped out and reverse engineered and a bunch of engine calls (including one to let you iterate the player list) were added.
</p>

<p>
	The old engine.cpp file was split up into multiple files to make it easier to manage. A lot of effort was put into performance as well. The first use of SSE in scripts.dll happened in 3.2. I wrote some new scripts. The first scripts for the Roleplay2 mod by Jerad Grey were added along with some more scripts from Kamiux. Zunnie wrote his first scripts and some more scripts were added for <abbr title="Red Alert: A Path Beyond"><abbr title="Red Alert: A Path Beyond">APB</abbr></abbr>. The custom HUD code was further improved (and a chunk of it was opened up in shaders.dll at this point, a decision I still regret to this day).
</p>

<p>
	3.2.1 followed with more bug fixes then 3.2.2 followed with even more fixes and 3.2.3 with yet more fixes.
</p>

<p>
	 
</p>

<h2>
	Scripts 3.2
</h2>

<p>
	Scripts 3.3 came next. In 3.3, the Control_Enable command was made to work over the network. Improvements were made to the shader code. Some font code was cloned, rewritten and improved. Support for "shader plugins" (which with the benefit of hindsight was a stupid idea) was added. The vehicle management dialog was added to let you kick people out of your vehicle. More fixes, cleanups and engine research continued as per usual. A Set_Vehicle_Gunner engine call was added. I wrote some new scripts. The normal map shader was improved (in particular fog now affected normal mapped objects). <abbr title="Red Alert: A Path Beyond"><abbr title="Red Alert: A Path Beyond">APB</abbr></abbr> got some new scripts.
</p>

<p>
	Then came 3.4. with more bug fixes/cleanups/engine research. A feature was added to change the default sort order for WOL servers so it sorted by player count rather than name (this took away the incentive for people to horde nicknames like aaaaaaaaaaaaa just to be first on the list). I write some more new scripts. Saberhawk added one new script and one script was written for <abbr title="Red Alert: A Path Beyond"><abbr title="Red Alert: A Path Beyond">APB</abbr></abbr>.
</p>

<p>
	3.4.1 followed soon after that with a bunch of bug fixes then 3.4.2 with more bug fixes, 3.4.3 with more bug fixes again then 3.4.4 (the final release of the 3.x series) came after that.
</p>

<h1>
	Credits
</h1>

<p>
	I would like to give thanks to all the people who's help in many different ways has made the scripts.dll project what it is today.
</p>

<ul>
	<li>
		Greg Hjelstrom
	</li>
	<li>
		Greg Underwood
	</li>
	<li>
		Aaron "Apoc" Kaufman
	</li>
	<li>
		Olaf Van Der Spek
	</li>
	<li>
		StealthEye
	</li>
	<li>
		Ghostshaw
	</li>
	<li>
		WhiteDragon
	</li>
	<li>
		Dblaney
	</li>
	<li>
		danpaul88
	</li>
	<li>
		Saberhawk
	</li>
	<li>
		Sir_Kane
	</li>
	<li>
		Chronojam
	</li>
	<li>
		NeoSaber
	</li>
	<li>
		Deezire
	</li>
	<li>
		moonsense715
	</li>
	<li>
		Romanov
	</li>
	<li>
		CCHyper
	</li>
	<li>
		Jerad2142 
	</li>
	<li>
		Triattack
	</li>
	<li>
		Zunnie
	</li>
	<li>
		YRR
	</li>
	<li>
		E!
	</li>
	<li>
		Vloktboky
	</li>
	<li>
		TheKGBSpy
	</li>
	<li>
		EvilWhiteDragon
	</li>
	<li>
		Mac
	</li>
	<li>
		Crimson
	</li>
	<li>
		Blazer
	</li>
	<li>
		v00d00
	</li>
	<li>
		Scorpio9a
	</li>
	<li>
		Reborn
	</li>
	<li>
		Pushwall
	</li>
	<li>
		Wallywood
	</li>
	<li>
		Dante
	</li>
	<li>
		Datalore
	</li>
	<li>
		NameHunter
	</li>
	<li>
		TimeFX
	</li>
	<li>
		<p>
			GeneralCamo
		</p>
	</li>
	<li>
		<p>
			Laeubi
		</p>
	</li>
	<li>
		<p>
			ChopBam
		</p>
	</li>
	<li>
		<p>
			OWA
		</p>
	</li>
</ul>

<p>
	And of course all the people involved in producing C&amp;C Renegade and all the C&amp;C Renegade Mods that exist out there and in testing the scripts.dll over the many years of development and anyone else I forget who has somehow contributed in some way to getting us where we are today.
</p>
]]></description><guid isPermaLink="false">6</guid><pubDate>Mon, 17 Jan 2022 20:38:35 +0000</pubDate></item><item><title>World Domination Tour</title><link>https://w3dhub.com/forum/documentation/articles/world-domination-tour-r7/</link><description><![CDATA[<p>
	World Domination Tour/Global Conquest is a W3D game mode (WIP) that lets players form teams and play games against other teams in order to gain control over countries in a continent of the Earth.<br>
	For example in <abbr title="Red Alert: A Path Beyond">APB</abbr>, the teams fight over domination of Europe.
</p>

<p>
	 
</p>

<h2>
	1. Summary
</h2>

<ul>
	<li>
		Teams have to sign up for the game to play.
	</li>
	<li>
		When it starts, participating teams are given starting countries equally.
	</li>
	<li>
		The game is played by teams attacking eachother's territory, trying to take over them by winning battles ingame.
	</li>
	<li>
		Attacks go in turns in the order teams signed up for game. The first team attacks first, then the next one, etc.<br>
		In short, each team in every round has a chance to conquer 1 country, while also having to defend their own ones from enemy attacks.
	</li>
	<li>
		The game ends when either 1 team owns all countries or the number of rounds played has reached the limit (e.g. 10) - then the team owning the most countries wins.
	</li>
</ul>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://w3dhub.com/forum/uploads/monthly_2022_01/preconquest1.png.3ebf4dde9139ca64a618e42d6db10000.png" data-fileid="33021" data-fileext="png" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="33021" data-ratio="62.50" data-unique="3s5krr1pe" style="" title="" width="400" alt="preconquest1.png" src="https://w3dhub.com/forum/uploads/monthly_2022_01/preconquest1.thumb.png.fa46c5c0e09a754358b3e1495e6a8025.png"></a>
</p>

<p style="text-align: center;">
	 
</p>

<h2>
	2. Preparations
</h2>

<p>
	Before the game can be played, teams need to register to play (minimum 2, maximum 5).
</p>

<p>
	Currently the teams are clans. If <strong>clan leaders</strong> log in on the ranks webpage and navigate to the <a href="https://w3dhub.com/ranks/apb/#/conquest" rel="external nofollow">Conquest menu</a>, they can register their team to play by pressing the 'Join game' button.
</p>

<p>
	 
</p>

<h2>
	3. Initializing the game
</h2>

<p>
	After enough teams have registered, the game can be initialized by a game moderator from ingame or IRC by using the <strong>!conquest</strong> command.<br>
	This command locks the partaking teams, hands out countries to all teams equally and automatically sets the next (first) battle.<br>
	The countries from here on are colorized to display their owner.
</p>

<p>
	 
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://w3dhub.com/forum/uploads/monthly_2022_01/conquest2.png.714057248575af0ccc3ec3313b2fcf4a.png" style="outline-width: 0px !important; user-select: auto !important;" data-fileid="33020" data-fileext="png" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="33020" data-ratio="62.50" data-unique="vqlmpsfwt" style="" title="" width="400" alt="conquest2.png" src="https://w3dhub.com/forum/uploads/monthly_2022_01/conquest2.thumb.png.8524a32e69f7c93366bb3cf4ac51f3b0.png"></a>
</p>

<p>
	 
</p>

<p>
	The first battle is always an attack done by the first team that registered for the game. The system automatically picks an enemy country next to one of their own countries.
</p>

<h6>
	<span>Note: the game/match/map where the game was initialized is not part of the game mode.</span>
</h6>

<h2>
	4. Playing the game - World map status
</h2>

<p>
	The game mode starts after the battle has ended on which the mode was initialized with the !conquest command.<br>
	The clan leader of the <strong>next attack</strong> has a maximum timeframe of <strong>5 minutes</strong> after the first initialization and at the start of every battle to change which country they want to attack by clicking a flashing country on the web.<br>
	Decide fast if your team is also involved in the currently active battle!
</p>

<p>
	Additionally before selecting a country to attack, clan leaders can build a Refinery or a War Factory in one of their countries in their turn. If they forgot to build one they will be able to build one more later, when their turn comes again. Refineries will grant an amount of global credits per round that can be spent to send reinforcements to other countries, besides that defenders of a country under attack will be donated 100 starting credits each one if a Refinery was previously built in that territory. There is no limit to the number of Refineries that can be built in a country and the more Refineries, the more global credits a team will get every round but the starting credits will still be limited to 100 for each player. On the other hand, the number of War Factories that can be built is limited to one and their only function is to provide reinforcements to other countries, this means that teams may call in reinforcements in a battle where one of its neighboring countries has a War Factory building.
</p>

<p>
	Clan leaders must be careful where they place buildings, as loosing a country will result in loosing the buildings too, because they will turn into enemy property!
</p>

<p>
	 
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://w3dhub.com/forum/uploads/monthly_2022_01/conquest1.png.34c288ad3d103671b0677c217edf6cde.png" style="outline-width: 0px !important; user-select: auto !important;" data-fileid="33023" data-fileext="png" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="33023" data-ratio="62.50" data-unique="wr973q3ya" style="" title="" width="400" alt="conquest1.png" src="https://w3dhub.com/forum/uploads/monthly_2022_01/conquest1.thumb.png.f9763760be3433b0ea1c3a2ce36ee84b.png"></a>
</p>

<h6>
	Note: picking the next country to attack is not only strategically important (choke points, locking enemy teams away, etc.) but it also decides what map exactly is going to be played. Each country has an assigned ingame map - hover over the countries to see them.
</h6>

<p>
	<span>Attacking rules:</span>
</p>

<ul>
	<li>
		<span>Your team can attack a country if it is next to one your owned countries (and is not currently under attack by another team).</span>
	</li>
	<li>
		You can NOT launch your attack from a country that is currently under attack! (Except if there are only 2 teams left and you only have 1 country left - but of course you will not have a chance for your next attack if you fail to defend it in the current battle)
	</li>
</ul>

<h6>
	Note: it is not a problem if the clan leader forgets to choose a country. One is always picked automatically, but this choice can be suboptimal.
</h6>

<p>
	 
</p>

<h2>
	5. Playing the game - Ingame
</h2>

<p>
	When a match starts, it is randomly decided which team will play as which game faction (e.g. Allies/Soviets, <abbr title="Global Defence Initiative">GDI</abbr>/Nod, etc.).<br>
	The system checks the ingame players' team affiliation and are switched to the appropriate faction.
</p>

<p>
	If the game is played in strict mode, anyone else joining the game (not affiliated with the 2 partaking teams) is forced to be a spectator. Otherwise, in non-strict mode, these players are distributed to even the teams.
</p>

<h3>
	Mercenaries
</h3>

<p>
	All of this can be changed by flagging players as mercenaries. Moderators can do this with the <strong>!merc</strong> command.<br>
	If a player is a mercenary, they will fight for the faction the moderator chose them to fight for.
</p>

<h6>
	Note: this is a way for someone to be hired by the enemy team for whatever reason and the only way to exit spectator status in strict mode.
</h6>

<h3>
	Reinforcements
</h3>

<p>
	Clan leaders fighting for their own clan can call in reinforcements with the <strong>!reinforcements &lt;number&gt;</strong> ingame command (number is 1 if it is omitted), as long as they built a nearby War Factory and they have enough global credits to spend. The "number" parameter is limited by the maximum drop locations that are available for that map. Besides this command has a cooldown, this means that it can only be used once every minute and additionally, an admin may have set an extra limit for the maximum available reinforcements for each call, for the first minutes of a game since map start.
</p>

<p>
	The match goes on normally, the faction/team will win by completing the game objective defined on the played map (most common victory conditions are high score or destroying the enemy base).
</p>

<h3>
	Effects on the map
</h3>

<p>
	After each battle finished, the world map is updated. If the attacker team won, they take the country. If the defenders won, they keep it and the world map does not change.
</p>

<p>
	 
</p>

<h2>
	6. End of the game mode
</h2>

<p>
	If a team has managed to conquer all of the countries in the region, they win. Alternatively, when the amount of rounds reaches the limit (e.g. 10 or 20) - then the team that owns the highest number of countries will win. It is possible to have multiple winners when they all have the same amount of countries.
</p>

<p>
	 
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://w3dhub.com/forum/uploads/monthly_2022_01/postconquest1.png.7e75a817afc76dc554b523d426b12318.png" style="outline-width: 0px !important; user-select: auto !important;" data-fileid="33022" data-fileext="png" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="33022" data-ratio="62.50" data-unique="v1qicx1bl" style="" title="" width="400" alt="postconquest1.png" src="https://w3dhub.com/forum/uploads/monthly_2022_01/postconquest1.thumb.png.be536c5b877f0a8afef097649eebae33.png"></a>
</p>
]]></description><guid isPermaLink="false">7</guid><pubDate>Mon, 17 Jan 2022 20:55:31 +0000</pubDate></item><item><title>Creating a Killfont</title><link>https://w3dhub.com/forum/documentation/articles/creating-a-killfont-r44/</link><description><![CDATA[<p>
	<span class="classich2">Introduction</span>This guide covers the steps that are required to create a killfont for W3D Engine games. There are a number of steps, and it will require a bit of art skill, as well as some specialised software for this task. This tutorial will not go into setting up the kill messages, as tutorials already exist for this.
</p>

<p>
	<span class="classich2">Required Software</span>
</p>

<ul>
	<li>
		3DS Max. (Can be optional, depending on how you want to create the art for the kill icons).
	</li>
	<li>
		Bitmap art program.
		<ul>
			<li>
				This can be Photoshop, paint.net, GIMP or any other program of this sort. I will use Photoshop, but the techniques are the same, and do not rely on anything in Photoshop.
			</li>
		</ul>
	</li>
	<li>
		Vector art program.
		<ul>
			<li>
				This can be Illustrator, Inkscape, or any other vector art program, as long as it can save SVG format files. In this tutorial, I will use Inkscape.
			</li>
		</ul>
	</li>
	<li>
		FontForge (this application creates the font)
	</li>
</ul>

<p>
	<span class="classich2">Prepare the art for the icon</span>The first thing you will need to do is create the vector art for the icon. This has a number of steps, and can be done many different ways. I will use the Harkonnen SMG from Battle for Dune as an example for the method I use for this.
</p>

<p>
	<span class="classich3">Step 1: Render a silhouette of the object</span>
</p>

<p>
	The first step in this method requires you to render a silhouette of the object in question. The angle of the image can vary, it can be a side view, it can be a forward view, or even a top view. What is required for this stage is a <span>silhouette that is </span><em>recognizable</em> as the object in question, and for firearms, that view is best gotten from a side view.
</p>

<p>
	For my method in 3DS Max, I first create a Standard material, I set the diffuse and ambient colours to pure white, and I set the self-illumination to 100. This will allow me to create a good, clean sillhouette.
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="33220" href="https://w3dhub.com/forum/uploads/monthly_2022_04/image.png.dcb8241e6415e1f570e70b6769eed000.png" rel=""><img alt="image.png" class="ipsImage ipsImage_thumbnailed" data-fileid="33220" data-ratio="118.11" data-unique="1vo9gkl6f" width="254" src="https://w3dhub.com/forum/uploads/monthly_2022_04/image.thumb.png.4a418a25a5ddf0819fb4f8270f1396ac.png"></a>
</p>

<p>
	<em>Fig. 1: Material settings for a silhouette material. </em>
</p>

<p>
	Apply this material to the meshes of the gun. If the weapon is already rigged for W3D, hide any bones that may get in the way of the render, such as Muzzle bones or eject bones.
</p>

<p>
	Position the gun in the middle of an orthographic view, side on. Make sure the gun fits in the width of the viewport.
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="33221" href="https://w3dhub.com/forum/uploads/monthly_2022_04/image.png.1ff9747be73d58103e6e66d768103745.png" rel=""><img alt="image.png" class="ipsImage ipsImage_thumbnailed" data-fileid="33221" data-ratio="50.75" data-unique="n32ghw2lt" width="400" src="https://w3dhub.com/forum/uploads/monthly_2022_04/image.thumb.png.48f8712da46a30d7f04aebd1da7a286b.png"></a>
</p>

<p>
	<em>Fig. 2: Gun model positioned correctly in an orthographic viewport.</em>
</p>

<p>
	Once both of these have been done, go to the Render Setup window. This can be accessed via the Rendering menu, or by pressing F10, or by pressing the Render Setup button on the Max Toolbar (<img alt="image.png" class="ipsImage ipsImage_thumbnailed" data-fileid="33222" data-ratio="110.53" data-unique="c2wv809sm" width="38" src="https://w3dhub.com/forum/uploads/monthly_2022_04/image.png.e489531064203025bde1076ec8013eb2.png">).
</p>

<p>
	Once that window has opened, change the Output Size to 512 pixels wide and 512 pixels high.
</p>

<p>
	<img alt="image.png" class="ipsImage ipsImage_thumbnailed" data-fileid="33223" data-ratio="40.76" data-unique="fvl3soxox" width="314" src="https://w3dhub.com/forum/uploads/monthly_2022_04/image.png.7a3e4005be0038ddde0a96260a79e9ff.png">
</p>

<p>
	<em>Fig. 3: Output size.</em>
</p>

<p>
	Once that is done, click render. A window with the side on silhouette should have been rendered. Save that render to a folder with other renders for the killfont. Save it as a 24 bit PNG, and make sure the alpha channel box is ticked.
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="33224" href="https://w3dhub.com/forum/uploads/monthly_2022_04/image.png.7fedad84001f7b860a33d38f26308518.png" rel=""><img alt="image.png" class="ipsImage ipsImage_thumbnailed" data-fileid="33224" data-ratio="91.46" data-unique="iipqt0twx" width="328" src="https://w3dhub.com/forum/uploads/monthly_2022_04/image.thumb.png.6acfda22958dd5e7a6b8537adc5500b6.png"></a>
</p>

<p>
	<em>Fig. 4: Settings for saving the weapon render.</em>
</p>

<p>
	Once this step is done, you can close 3DS Max at this point, as you are finished with that application.
</p>

<p>
	<span class="classich3">Step 2: Cleaning the Silhouette up</span>
</p>

<p>
	Open up the silhouette you just created in the art package of choice.
</p>

<p>
	The first thing you want to do is invert the image, making the white silhouette black.
</p>

<p>
	Then, you need to clean the artwork up. This stage is more subjective, but essentially, you need to remove, or make more chunky, any small detail in the weapon's silhouette. Small detail will disappear or distort the vector version of the art, so making sure the art is chunky is key.
</p>

<p>
	As an example, here is the Harkonnen SMG before and after cleanup.
</p>

<p>
	Before:<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="33226" href="https://w3dhub.com/forum/uploads/monthly_2022_04/HRK-SMG.png.f18a10dc15ac0b673eba837c58dcca53.png" rel=""><img alt="HRK-SMG.png" class="ipsImage ipsImage_thumbnailed" data-fileid="33226" data-ratio="100.00" data-unique="3bqd2nva4" width="300" src="https://w3dhub.com/forum/uploads/monthly_2022_04/HRK-SMG.thumb.png.c83038552040b6f7bfc09ddf6adf2e8d.png"></a> After: <a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="33227" href="https://w3dhub.com/forum/uploads/monthly_2022_04/HRK-SMG.png.273fbee9a3bb03155ec56eac52142baf.png" rel=""><img alt="HRK-SMG.png" class="ipsImage ipsImage_thumbnailed" data-fileid="33227" data-ratio="100.00" data-unique="xenttveq5" width="300" src="https://w3dhub.com/forum/uploads/monthly_2022_04/HRK-SMG.thumb.png.66f1e1cd7d7843213db70be39034dd8c.png"></a>
</p>

<p>
	<em>Fig. 5: Before and after of the Harkonnen SMG PNGs.</em>
</p>

<p>
	Notice how I removed the holes in the gun's front, and made the ironsights chunkier. Things like that go a long way to making a clean kill icon, especially as these will only be as small as the text in game. Make sure you zoom out every now and again to see how it looks small.
</p>

<p>
	Once this is done, save the png again and close the image editor.
</p>

<p>
	<span class="classich3">Step 3: Vectorization</span>This step is the simplest step, and I recommend doing it in Inkscape even if you have Illustrator. Open Inkscape, drag the PNG into the new document, then right click the PNG and hit "Trace Bitmap..."
</p>

<p>
	This will open the trace bitmap settings.
</p>

<p>
	You shouldn't have to change any settings except for one: Make sure "Remove background" is ticked. You can use the preview window to check what the traced image will look like. Hit OK once you are happy with it.
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="33228" href="https://w3dhub.com/forum/uploads/monthly_2022_04/image.png.2777a1916012fad0de03f82862895dcd.png" rel=""><img alt="image.png" class="ipsImage ipsImage_thumbnailed" data-fileid="33228" data-ratio="72.50" data-unique="lo1hp3qgz" width="400" src="https://w3dhub.com/forum/uploads/monthly_2022_04/image.thumb.png.6844607f33dc9c42c826070a9833ee65.png"></a>
</p>

<p>
	<em>Fig. 6: Trace Bitmap window in Inkscape. Note that "Remove background" is ticked!</em>
</p>

<p>
	Next, delete the PNG weapon image. You may have to move the new vector image off of the top of it. At this stage, save the vector version to the same folder as the PNG image, and then close Inkscape.
</p>

<p>
	<span class="classich3">Step 4: Font Creation</span>This is the trickiest part of the process. Open FontForge. For this example, I will be editing an existing font, Arial MT. Included in this tutorial is a copy of that font in FontForge SFD format as a base. Download it here: <a class="ipsAttachLink" data-fileid="33229" href="https://w3dhub.com/forum/applications/core/interface/file/attachment.php?id=33229&amp;key=a754c8d9b024ecdff5db9a9c3b9fd9de" data-fileext="sfd" rel="">ArialMT_BFD.sfd</a>
</p>

<p>
	Open that SFD file in FontForge, and it will show you the main font "chart" window:
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="33230" href="https://w3dhub.com/forum/uploads/monthly_2022_04/image.png.0199123076c12b4f15080365fbb7ee10.png" rel=""><img alt="image.png" class="ipsImage ipsImage_thumbnailed" data-fileid="33230" data-ratio="44.50" data-unique="xqvlw1cjx" width="400" src="https://w3dhub.com/forum/uploads/monthly_2022_04/image.thumb.png.84fd7740743d2bbe4313b2dc33861942.png"></a>
</p>

<p>
	<em>Fig. 7: FontForge main window.</em>
</p>

<p>
	When creating a W3D killfont, we need the font "glyphs" (the actual character images in the font) to be in a certain place, the <strong>Private Use Area</strong>. This area in a font is for whatever the font designer wants to use it for, and is not replacing any existing characters that have a proper meaning in one language or another.
</p>

<p>
	To get to that area, go to the View Menu, and hit "Goto". It will pop open a small window. Hit the arrow on the side of the side of the text entry box, and choose "Private Use Area", then hit OK.
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="33231" href="https://w3dhub.com/forum/uploads/monthly_2022_04/image.png.97c2935b955f5e2121a9e9f56c88ee83.png" rel=""><img alt="image.png" class="ipsImage ipsImage_thumbnailed" data-fileid="33231" data-ratio="29.25" data-unique="ci51kx1n5" width="400" src="https://w3dhub.com/forum/uploads/monthly_2022_04/image.thumb.png.e528c638c1a2f2290101a195bba16276.png"></a>
</p>

<p>
	<em>Fig. 8: The Goto window.</em>
</p>

<p>
	This will take you down to a bunch of empty font squares. with names like E000, etc. These are the Private Use Area characters, and they are what we will use for our killicons.
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="33232" href="https://w3dhub.com/forum/uploads/monthly_2022_04/image.png.122d7356623f03ebf8b1fd355cb8f5b9.png" rel=""><img alt="image.png" class="ipsImage ipsImage_thumbnailed" data-fileid="33232" data-ratio="44.50" data-unique="h87mfyqyr" width="400" src="https://w3dhub.com/forum/uploads/monthly_2022_04/image.thumb.png.07897a38ee29a99b7f838e714eb1cbe1.png"></a>
</p>

<p>
	<em>Fig. 9: The Private Use Area. E000 is selected, and is the first PUA character in the font.</em>
</p>

<p>
	Double click that E000 character box, and it will open the Glyph Editor window.
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="33233" href="https://w3dhub.com/forum/uploads/monthly_2022_04/image.png.62a03cde820d52ca103f08a4fe63e619.png" rel=""><img alt="image.png" class="ipsImage ipsImage_thumbnailed" data-fileid="33233" data-ratio="70.00" data-unique="3dcgms45x" width="400" src="https://w3dhub.com/forum/uploads/monthly_2022_04/image.thumb.png.bb02db877bea9facad572b19b8325c0b.png"></a>
</p>

<p>
	<em>Fig. 10: The Glyph Editor window.</em>
</p>

<p>
	At this point, we want to import our SVG icon into the font. Go to File &gt; Import. Change the Format to SVG, and go to where the SVG you created is, and select it. Then, hit Import.
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="33234" href="https://w3dhub.com/forum/uploads/monthly_2022_04/image.png.810753554e3b526b0ecdf92041c3694c.png" rel=""><img alt="image.png" class="ipsImage ipsImage_thumbnailed" data-fileid="33234" data-ratio="85.96" data-unique="80006d6y9" width="349" src="https://w3dhub.com/forum/uploads/monthly_2022_04/image.thumb.png.fb63b703c81c3f09126013c805533b48.png"></a>
</p>

<p>
	<em>Fig. 11: The Import dialog</em>
</p>

<p>
	At this point, the icon should be in the glyph editor, but it is a little small. We need the icon to fit inbetween the top and bottom lines, with the "middle" of the gun just a little bit off the middle line (as the middle line is where the "bottom" of a letter without a descender sits.)
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="33236" href="https://w3dhub.com/forum/uploads/monthly_2022_04/image.png.6b1857ba1f23f71c0d4fcba2c7b26613.png" rel=""><img alt="image.png" class="ipsImage ipsImage_thumbnailed" data-fileid="33236" data-ratio="70.00" data-unique="wq4gmzb5d" width="400" src="https://w3dhub.com/forum/uploads/monthly_2022_04/image.thumb.png.433d0d9e8ba0a10f8f1739e523fddfec.png"></a>
</p>

<p>
	<em>Fig. 12: Our icon, but too small.</em>
</p>

<p>
	Drag a selection box around the icon, then go to Element &gt; Transformations &gt; Transform. Set the transformation to Scale Uniformly, and set the scale to something around 400-425%. Hit apply to see a preview, and if it looks about right, then hit OK.
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="33235" href="https://w3dhub.com/forum/uploads/monthly_2022_04/image.png.f97785695d1af551d85d5b26e76846c1.png" rel=""><img alt="image.png" class="ipsImage ipsImage_thumbnailed" data-fileid="33235" data-ratio="103.09" data-unique="7ol8ok9r7" width="291" src="https://w3dhub.com/forum/uploads/monthly_2022_04/image.thumb.png.2cb9256fa214f764c5079c7e3b71febd.png"></a>
</p>

<p>
	<em>Fig. 13: The Transform dialog, with proper settings.</em>
</p>

<p>
	Once that is done, it's time to position it. Drag the icon so it sits roughly in the middle of the top and middle lines in the glyph editor, like this:
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="33237" href="https://w3dhub.com/forum/uploads/monthly_2022_04/image.png.3635c1b2743cde7de5b54c4a328e7ed0.png" rel=""><img alt="image.png" class="ipsImage ipsImage_thumbnailed" data-fileid="33237" data-ratio="45.00" data-unique="neez0j861" width="400" src="https://w3dhub.com/forum/uploads/monthly_2022_04/image.thumb.png.676dc4a1c7a5d3d8aa2e0960568bff57.png"></a>
</p>

<p>
	<em>Fig. 14: Good icon positioning.</em>
</p>

<p>
	Finally, drag the rightmost line to just after the end of the icon, so that there's a small gap between it and the gun icon, like so:
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="33239" href="https://w3dhub.com/forum/uploads/monthly_2022_04/image.png.8520586137529e268cb63810e1cfe9ba.png" rel=""><img alt="image.png" class="ipsImage ipsImage_thumbnailed" data-fileid="33239" data-ratio="45.50" data-unique="zdpr3cshu" width="400" src="https://w3dhub.com/forum/uploads/monthly_2022_04/image.thumb.png.b7a4a36dd474a54503d8332e778bcf11.png"></a>
</p>

<p>
	<em>Fig. 15: Good spacing (the font term for this is kerning, fyi!)</em>
</p>

<p>
	This will make sure the spacing between the icon and the text is correct when being used in game. Now close the glyph editor. You should see your new icon in the font.
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="33240" href="https://w3dhub.com/forum/uploads/monthly_2022_04/image.png.5f1ed0b536cfd8f14599755ad4d8538e.png" rel=""><img alt="image.png" class="ipsImage ipsImage_thumbnailed" data-fileid="33240" data-ratio="44.50" data-unique="tdh2ljiyr" width="400" src="https://w3dhub.com/forum/uploads/monthly_2022_04/image.thumb.png.df16332b23bc184b08686a62be3d2d83.png"></a>
</p>

<p>
	<em>Fig. 16: Our new icon in the font!</em>
</p>

<p>
	Save the SFD at this point, we don't want to lose any work.
</p>

<p>
	To test the font, we can export it and have Windows install it as a font. Go to File &gt; Generate Fonts..., and then set the type to "TrueType". The font should be generated by default in the same folder as the SFD. Hit OK to generate the font.
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="33242" href="https://w3dhub.com/forum/uploads/monthly_2022_04/image.png.c644b6686152d5ca55db39d43b48b70c.png" rel=""><img alt="image.png" class="ipsImage ipsImage_thumbnailed" data-fileid="33242" data-ratio="123.97" data-unique="8bm95f7qh" width="242" src="https://w3dhub.com/forum/uploads/monthly_2022_04/image.thumb.png.5254d24172c75c304ced747d43b71de3.png"></a>
</p>

<p>
	<em>Fig. 17: Generation</em>
</p>

<p>
	Once the font is generated, go to the folder with the font, right click it, and click Install. If you've regenerated the font and are reinstalling the new version, Windows may ask you if you want to overwrite the font.
</p>

<p>
	At this point, we can quickly check our new icon in the Windows Character Map program. If all has gone right, the new icon should be towards the bottom of the font:
</p>

<p>
	 <a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="33243" href="https://w3dhub.com/forum/uploads/monthly_2022_04/image.png.6e487f89211bd3eeeae10f554cdd8c6e.png" rel=""><img alt="image.png" class="ipsImage ipsImage_thumbnailed" data-fileid="33243" data-ratio="86.71" data-unique="few9evyg2" width="346" src="https://w3dhub.com/forum/uploads/monthly_2022_04/image.thumb.png.acd757e59a2e8ebbb3d9a0244b8bf51d.png"></a>
</p>

<p>
	<em>Fig. 18: Our new icon, in the actual font, ready for use.</em>
</p>

<p>
	At this point, you can continue making icons to fill up the whole font! Good luck, and have fun!
</p>
]]></description><guid isPermaLink="false">44</guid><pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate></item></channel></rss>
