<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.trainzsimulator.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Agentmike</id>
	<title>TrainzOnline - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.trainzsimulator.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Agentmike"/>
	<link rel="alternate" type="text/html" href="https://wiki.trainzsimulator.com/wiki/Special:Contributions/Agentmike"/>
	<updated>2026-11-05T06:12:03Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.46.2</generator>
	<entry>
		<id>https://wiki.trainzsimulator.com/index.php?title=Normal_map&amp;diff=1366</id>
		<title>Normal map</title>
		<link rel="alternate" type="text/html" href="https://wiki.trainzsimulator.com/index.php?title=Normal_map&amp;diff=1366"/>
		<updated>2010-03-19T01:05:14Z</updated>

		<summary type="html">&lt;p&gt;Agentmike: Broken link fixed&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The normal map is an additional texture file used simulaneously with the [[diffuse map]] to allow per-pixel lighting control. An overview of the normal mapping technique can be found on wikipedia [http://en.wikipedia.org/wiki/Normal_mapping].&lt;br /&gt;
&lt;br /&gt;
The color channels (red, green, blue) of the normal map determine the X, Y, and Z value for the pixel normal in tangent space. This information is not considered human-editable, and you should not attempt to manipulate these channels directly. Specifically, do not adjust the dimensions or contrast of an existing normal map. If you need to adjust the size of a normal map, you will need to rebuild the normal map using the original tools. If you need to adjust the bump height in a normal map, you will need to adjust the source geometry and rebuild the normal map using the original tools.&lt;br /&gt;
&lt;br /&gt;
Editing the normal map in photoshop or similar will cause undefined behavior in-game. Additionally, any form of lossy compression (such as .JPG format) will destroy a significant amount of the information contained in a normal map. Do not use lossy formats for storing normal maps even as an intermediate step.&lt;br /&gt;
&lt;br /&gt;
The alpha channel of the normal map is typically used to provide per-pixel control of the [[specular highlight]]. White gives a strong specular, suitable for metals and water. Black gives no specular, more suitable for dark earth. Grays are a mid-strength specular. It is safe to edit the alpha channel in a tool such as photoshop, provided that the color channels are not modified in any way.&lt;br /&gt;
&lt;br /&gt;
If no alpha channel is specified, the normal map will default to a full white alpha channel. Since a white alpha channel indicates a strong specular, which will look strongly metallic or plastic on most textures, it is not usually suitable to provide a normal map with no alpha channel. For this reason, it is recommended that the .TGA file format is used for alpha channels.&lt;br /&gt;
&lt;br /&gt;
==How a Normal Map works==&lt;br /&gt;
Normal maps work by modifying the normal of the pixel. Typically a normal will stick straight up from the surface; a normal map will rotate that normal on either the Y or X axis. &lt;br /&gt;
&lt;br /&gt;
In the following example we look strictly at the red channel; which controls the X axis of the normal. The arrows represent the normals. In example A there would be no normal map applied so all the normals would point straight away from the surface. In example B a normal map would be applied, modifying the normals in the appropriate areas. &lt;br /&gt;
&lt;br /&gt;
[[Image:normalhow01.jpg]]&lt;br /&gt;
&lt;br /&gt;
There are a couple important things to note about this example. Let’s take a look at the red channel of the above example. On a given axis a normal can be rotated 90 degrees in either direction. The grayscale values in the normal map represent which way the normal is rotated. In our example a value of 0 would rotate the normal -90 degrees, for a value of 128 the normal would be rotated 0 degrees, and for a value of 255, the normal would be rotated +90 degrees. The green channel works in the same way. &lt;br /&gt;
&lt;br /&gt;
[[Image:normalhow02.jpg]]&lt;br /&gt;
&lt;br /&gt;
==Examples==&lt;br /&gt;
A typical normal map will look similar to the following image.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Note that this image is for illustration purposes only - jpg format is not appropriate for normal maps.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
:[[image:demo-normal.jpg|Normal map illustration]]&lt;br /&gt;
&lt;br /&gt;
==Displaying Normal maps in 3D Studio Max==&lt;br /&gt;
&lt;br /&gt;
Displaying normal maps in 3D Studio Max&lt;br /&gt;
&lt;br /&gt;
The appropriate way to display a normal map in 3D Studio Max is to use a “Normal Bump” map in the bump slot of the material. If you load a map directly into this slot it will display/render, but is viewing the map as a bump map and will not display correctly.&lt;br /&gt;
&lt;br /&gt;
[[Image:displaymax01.jpg]]&lt;br /&gt;
&lt;br /&gt;
To display Trainz normal maps from within max we need to flip the Green channel to display the map correctly. This can be done within the material editor without having to actually modify the map. &lt;br /&gt;
&lt;br /&gt;
In the properties for the Normal Bump under Channel Direction you need to check “Flip Green(Y)”. Lastly, load your normal map into the “Normal:” Slot.&lt;br /&gt;
&lt;br /&gt;
[[Image:displaymax02.jpg]]&lt;br /&gt;
&lt;br /&gt;
There’s one last step to displaying your normal maps within Max. There is a different way of previewing the normal map depending on which version of max you are using.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3D Studio Max 9 and below:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In the material editor for the material you want to display under the DirectX Manager rollout make sure to check “DX Display of Standard Material”  In the upper right hand of the material editor there is a blue checkered box which will turn pink, indicating that you are using DX display of the material. Click that button to show the maps in the viewport.&lt;br /&gt;
&lt;br /&gt;
[[Image:displaymax03.jpg]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3D Studio Max 2008 and Above:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Click and hold on the blue and white checked box in the material editor. A popup will open with two options, a blue and white checked box and a pink and white checked box. Select the pink and white checked box to display the material as a DirectX shader in the viewport. &lt;br /&gt;
&lt;br /&gt;
[[Image:displaymax04.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Getting Started with Normal Mapping==&lt;br /&gt;
Refer to [[Getting Started with Normal Mapping|this page]] for notes on setting up an asset to illustrate these techniques.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Baking Normal Maps Using Max==&lt;br /&gt;
[[HowTo/Build_normal_maps_in_Max|Baking Normal Maps in 3D Studio Max]]&lt;br /&gt;
&lt;br /&gt;
Note that normal maps produced by Max typically have a reversed green (Y) channel. At the current time, this must be fixed after export by manually opening the resultant normal map in photoshop, selecting only the Green channel, and using the Invert (ctrl-I) tool. Failure to correct the green channel results in incorrect lighting effects within the game environment, destroying the effectiveness of the normal map.&lt;/div&gt;</summary>
		<author><name>Agentmike</name></author>
	</entry>
	<entry>
		<id>https://wiki.trainzsimulator.com/index.php?title=Script_Feature_Requests&amp;diff=689</id>
		<title>Script Feature Requests</title>
		<link rel="alternate" type="text/html" href="https://wiki.trainzsimulator.com/index.php?title=Script_Feature_Requests&amp;diff=689"/>
		<updated>2009-11-14T14:21:25Z</updated>

		<summary type="html">&lt;p&gt;Agentmike: /* Requests */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is where the [[scripting]] community gets to post all their API feature requests. Request any additions that you think will enhance the game. Things to keep in mind:&lt;br /&gt;
* We are unlikely to add a feature which breaks any existing content.&lt;br /&gt;
* Script is for control purposes, and is not intended to enable significant modifications to the underlying game engine. We are very unlikely to introduce a feature where the obvious uses are going to result in significant performance penalties.&lt;br /&gt;
* We are far more likely to add features which are directly blocking something that the community is working on. If you have something cool, and need just a few minor additions then please detail what you&#039;re working on (ideally, on another wiki page linked from both here and your [[Content Creation Groups]] page) and why you need the additions.&lt;br /&gt;
* [[MiniBrowser]] requests should go on the separate [[MiniBrowser Feature Requests]] page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Requests==&lt;br /&gt;
Requests are placed in this section by the community, for discussion and possible inclusion.&lt;br /&gt;
&lt;br /&gt;
* Add a method that will let you identify the industry at which a vehicle is located. If an industry track section can also carry the industry identifier, it would be most helpful.&lt;br /&gt;
&lt;br /&gt;
* Add a handle to allow a custom bell animation to be played when the bell is played on a locomotive (Vehicle.StartBell() and Vehicle.StopBell(), perhaps?).  Justification: Script can currently listen for the bell message, but since the message is a toggle, it is easy to get out of synch with the true state of the bell. For example, when coupling a locomotive whose bell is ringing to a locomotive whose bell is not ringing, the end result depends on which locomotive is currently in focus. - Curtis&lt;br /&gt;
&lt;br /&gt;
* Be able to interact with the outside world: ability to create a basic Socket or some form of a StreamReader/Writer to write to files or send messages via the network. -Roman&lt;br /&gt;
&lt;br /&gt;
* Scale the visible bulk load animation on a traincar such that it takes Vehicle.GetLoadTime() to complete.  For example, if Vehicle.GetLoadTime() returns 5 seconds, the bulk animation would take 5 seconds to transition from the full state to the empty state.  This would be useful for industries that take more than one second to load / unload a car, as the visible load animation could be synced more closely with the industry animation. -Curtis&lt;br /&gt;
&lt;br /&gt;
* SetMeshPosition(&amp;quot;meshname&amp;quot;, x,y,z) absolute positioning of a Mesh or Object. -Caby&lt;br /&gt;
: &amp;lt;font color=red&amp;gt;This exists ~Andi&amp;lt;/font&amp;gt;&lt;br /&gt;
:: &#039;&#039;Not necessarily - we support relative positioning, not absolute. This may or may not achieve what he wants.&#039;&#039; ~chris&lt;br /&gt;
&lt;br /&gt;
* GetMeshPosition(&amp;quot;meshname&amp;quot;, &amp;quot;x&amp;quot;)[&amp;quot;Y&amp;quot;][&amp;quot;Z&amp;quot;] receive the absolute position of a Mesh or Object. -Caby&lt;br /&gt;
: &amp;lt;font color=red&amp;gt;Since you have used SetMeshPosition() to move the mesh, this is unneccessary&amp;lt;/font&amp;gt;&lt;br /&gt;
:: &#039;&#039;Absolute position can be set in Surveyor. Relative position can be set in the [[config.txt file]]. I wouldn&#039;t say that this is completely unnecessary.&#039;&#039; ~chris&lt;br /&gt;
&lt;br /&gt;
* Extension to the function World.GetAssetList(string kind, bool OnlyIfUsedInCurrentMap) -Andi06&lt;br /&gt;
&lt;br /&gt;
* Ability to play an avi and wait for it to finsh (no user interaction allowed) ~Jenolan&lt;br /&gt;
&lt;br /&gt;
* Ability to load a menu asset directly from the command line ~Jenolan&lt;br /&gt;
&lt;br /&gt;
* The ability to modify scenery trigger radii on the fly in script. This is really aimed at crossings so that train detection can be varied in line with track speed limits.  -Andi06&lt;br /&gt;
&lt;br /&gt;
* A method of refreshing the Property Browser to take account of any change in the target object&#039;s name during a property editing session. (Objects which have &#039;autoname 1&#039; in config will often be renamed by the user.  In some circumstances I am using the object name to set other properties. Typically an object might be created as &#039;Double Slip 1&#039; and might refer to its constituent nodes as &#039;Double Slip 1,Track 1&#039;.  This is to enable other objects to refer to it in a user friendly way.  On a name change the Property Browser continues to use the old name until the browser has been closed and reopened.  This is counter intuitive) -Andi&lt;br /&gt;
&lt;br /&gt;
* Ability for a script to be able to read/change loco/rolling stock parameters (ie to simulate one loco losing air etc etc etc) ~Jenolan&lt;br /&gt;
&lt;br /&gt;
* Need to be able to detect if the user has turn off logging ie -nolog as people forget that they have done it and we log diagnostics if there is a problem. ~Jenolan&lt;br /&gt;
&lt;br /&gt;
* SetFXCoronaTexture() A means of resetting to config.txt defaults.&lt;br /&gt;
&lt;br /&gt;
* At the moment we are using F8 as out deadman switch. Would like two key bindings &#039;User1&#039; &#039;User2&#039; that sends a message the same style as F8 does (with User1 &amp;amp; User2 as the minor) so that we can do the deadman and a hud control. ~Jenolan&lt;br /&gt;
&lt;br /&gt;
* Be able to play mp3 as well as wav. ~Jenolan&lt;br /&gt;
: &#039;&#039;I&#039;ve been able to do this where the asset doing the playing is a script library, I had Acker Bilk coming over a station tannoy at one point.  Not sure why it doesn&#039;t seem to work elsewhere. -Andi&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Interface.MessageBox(Caption,Text), calling up a small browser with a close button would be helpful, especially for novices. Interface.Print() is a monumental PITA because it prints out upside down, doesn&#039;t hold enough lines, and only works in Driver. For sure its possible to write your own version of this but browsers aren&#039;t all that easy to get your head around and its a very basic facility that should be built in. -Andi&lt;br /&gt;
&lt;br /&gt;
* A standard config.txt tag &#039;junction-type normal/singleslip/doubleslip&#039; etc together with a spec for construction and behaviour might be helpful. I already have a complete schema for this. -Andi&lt;br /&gt;
: &#039;&#039;Uncertain what you&#039;re expecting to achieve here? -chris&#039;&#039;&lt;br /&gt;
: &#039;&#039;see Animated Fixed Junctions Thread&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Is it possible to make a mesh available which matches the existing graphic direction indicators, it appears to be some sort of directional corona or variant. If not could a new marker mesh be developed that could be used with both types? The existing one has nasty alpha effects in any case. -Andi&lt;br /&gt;
&lt;br /&gt;
* Minimap Support, don&#039;t care personally but some will. -Andi&lt;br /&gt;
&lt;br /&gt;
* Ability to dynamically change the length of a piece of rolling stock as part of the load / unload process; to support logging disconnects (see http://www.trainzone.co.nz/logging.htm for examples)- Curtis&lt;br /&gt;
: &#039;&#039;This is an interesting concept, but sounds difficult to implement. I can&#039;t think of any way of adjusting the length unless it was the end item of a consist, since adjustment at any other time would require displacing the remainder of the consist. Could you expand on your ideas please.&#039;&#039; -chris&lt;br /&gt;
: &#039;&#039;The entire car, including lmfront &amp;amp; lmback, would be part of the loading / unloading animation. When loading, it would probably be necessary to displace the consist by moving one of the ends - perhaps the end with the locomotive? Potential issue: if when loading, the increase in consist length causes the end of the consist to run off the end of the track or collide with another train.  When unloading, you could break the consist at either or both lmfront / lmback - whichever move as part of the unloading animation.&#039;&#039; - Curtis&lt;br /&gt;
: &#039;&#039;May be simpler to just break the consist at both lmfront and lmback; centering the car in-between the two halves. -Curtis&lt;br /&gt;
&lt;br /&gt;
*Allow SetFXNameText(effect,text) to accept an empty string in the second parameter - Reason: It&#039;s really irritating having to write workarounds for this. ~Andi&lt;br /&gt;
&lt;br /&gt;
*Turntables: Write access to the &amp;quot;angle&amp;quot; tag array in script.  Now that TrackSearch will allow me to find out what is attached to a Turntable it would be nice to extend my turntable kit to disallow non existent connections. ~Andi&lt;br /&gt;
&lt;br /&gt;
*SetMeshScale(X,Y,Z) and corresponding config tags. Positive or negative values would implement mesh mirroring at the same time. As an example of potential a placement option for trees might allow random scale factors (within reasonable limits) and random rotation.  Each tree placed would then vary in size, shape and rotation getting much more variation from the same mesh asset. ~Andi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Update to product loading / unloading functionality to allow incremental loads and unloads.&lt;br /&gt;
:Potential usages:  &lt;br /&gt;
:- Animation that plays once per item being loaded; such as a forklift carrying a crate to a boxcar, or a crane lifting a log to a flatcar.&lt;br /&gt;
:- Allow dynamic load times of bulk loads (small cars load faster than large cars), with the animated load rising / lowering synchronously.&lt;br /&gt;
&lt;br /&gt;
:Potential implementation:&lt;br /&gt;
:Extend vehicle.LoadProduct(report,units) where units = integer number of queue to be loaded each increment.  0 would be everything, defaulting to current LoadProduct() behavior, and add additional calls BeginIncrementalLoad(), EndIncrementalLoad(), BeginIncrementalUnload(), and EndIncrementalUnload().&lt;br /&gt;
&lt;br /&gt;
:During a load operation that loads 3 increments (units=1, target queue on the car = 3), the flow would look like:&lt;br /&gt;
 BeginLoad() // open car doors; station doors&lt;br /&gt;
 &lt;br /&gt;
 BeginIncrementalLoad() //  start loading animation, start sounds; pfx; add any delays&lt;br /&gt;
 TransferProductFrom() // maximumToTransfer = units&lt;br /&gt;
 EndIncrementalLoad() // animate forklift returning to station / end sounds / pfx / other cleanup&lt;br /&gt;
 &lt;br /&gt;
 BeginIncrementalLoad()&lt;br /&gt;
 TransferProductFrom()&lt;br /&gt;
 EndIncrementalLoad()&lt;br /&gt;
 &lt;br /&gt;
 BeginIncrementalLoad()&lt;br /&gt;
 TransferProductFrom()&lt;br /&gt;
 EndIncrementalLoad()&lt;br /&gt;
 &lt;br /&gt;
 EndLoad() // close car &amp;amp; station doors&lt;br /&gt;
&lt;br /&gt;
* Ability to add a vehicle to an existing consist like Vehicle.Reposition( Train, MyCouple, OtherCouple ) this would save needing a work track mark to add vehicles which would be very helpful ~Jenolan&lt;br /&gt;
&lt;br /&gt;
* Extension to AddHandler to allow this syntax: AddHandler(target,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;MessageHandler&amp;quot;), passing all messages to the specified handler, for justification see discussion page. -Andi&lt;br /&gt;
&lt;br /&gt;
* Ability to store any information along with the layout and not the session (i.e. &#039;&#039;PropertyObject.SetLayoutProperties&#039;&#039; and &#039;&#039;PropertyObject.GetLayoutProperties&#039;&#039;, taking/returning &#039;&#039;Soup&#039;&#039; objects respectively). Rationale: the non-existence is a major drawback with configurable signals - [[User:Klausm|Klausm]]&lt;br /&gt;
&lt;br /&gt;
* Ability for an asset to be able to change and save it&#039;s local soup (ie stringtable) ~Jenolan&lt;br /&gt;
&lt;br /&gt;
* Access to asset location, height, rotation in script.  This came up twice - once when I wanted to keep traffic lights upright when the containing asset is rolled, and once when I wanted to add simple real time ground shadows to assets. -Andi06&lt;br /&gt;
&lt;br /&gt;
* Ability to arbitrarily add an attachment point to an item. To allow things like FRED/BOG sundry animations and so on ~Jenolan&lt;br /&gt;
&lt;br /&gt;
* Not really script. A generic clickable mesh object, its an easy hack using a fixedtrack junction but it would nice to have an official version - click on the engine shed to open the doors, click on the signal box to open a track browser etc etc. Mappable click regions too if its not too much to ask :-) -Andi&lt;br /&gt;
&lt;br /&gt;
* On a similar note is there any chance you might amend the Exception dialogue to specify the object, (or even the Asset) which is causing the exception :-) -Andi&lt;br /&gt;
&lt;br /&gt;
* Extension/Alternative to World.GetJunctionList to return fixed track junction objects or nodes, I can script this easily for objects using my library but this would not be the case for all junctions. -Andi&lt;br /&gt;
&lt;br /&gt;
* World.Play2DSound(Asset,filename) allows sound files to be saved in a &#039;sound library&#039; asset and avoids duplication.  Can we have a similar facility for images to be used in html assets.  A lot of the dependencies that I use are images and icons.  I&#039;m consciously trying to avoid this now - its the source of much pain - but to do this for the Junction Kit for instance I would have to have copies of all necessary images in all of the placeable assets (there are more than 50) If I could simply keep one copy in the script library it would save much bandwidth, diskspace and support. -Andi06&lt;br /&gt;
&lt;br /&gt;
* genesteal : methods applied to current train, may be class world.gs:&lt;br /&gt;
- Train.GetNextSignal() : return next Signal same direction, distance and signal state.&lt;br /&gt;
- Train.GetNextExSignal() : the same for extended states&lt;br /&gt;
- Train.GetNextTrackside () : return next trackside same direction, distance, speedlimit if exists.&lt;br /&gt;
- Train.GetNextJunction () : return next junction, distance and direction.&lt;br /&gt;
&lt;br /&gt;
* genesteal : cab features.&lt;br /&gt;
- methods for ligth controls in cabin : Control.SetFlash (float frequency).Make the control visible/invisible on the intervall frequency. may be Meshobjects.gs for more general purpose. The same for texture swapping in texture replacement.&lt;br /&gt;
- New conrol cab &amp;quot;button&amp;quot; with vertical translation limit : method set and get value as usual, method for &amp;quot;while depressed&amp;quot; behavior: Setdepressed ( method to run).&lt;br /&gt;
&lt;br /&gt;
- Speedlimiter method : Set a speedlimit replacing the max speed possible on cab mode.(engine)&lt;br /&gt;
&lt;br /&gt;
- Set engine methods : &lt;br /&gt;
Locomotive.SwapEngine(kuid); replace engine by another for a locomotive. feature existing on actual loco to set a traction service if the loco have to drive freight or passengers consists. This method can replace speedlimit above and may be more accurate : speedlimit and power will be set together as prototypical setting before a journey. &lt;br /&gt;
- Locomotive.EngineStop(): stops the enginesound  and play a stop.wav, located in enginesound folder.&lt;br /&gt;
- Locomotive.EngineStart() : starts enginesound like this : play  a start.wav located in enginesound folder, then idle 0.wav.&lt;br /&gt;
&lt;br /&gt;
* Allow function Vehicle.SetTractionMultiplier(float) to set multiplier to 0. ~Mike&lt;br /&gt;
: UPD: sorry, misunderstood functionality of this function. But could there be a method to disable traction on locos?&lt;br /&gt;
&lt;br /&gt;
* Ability to change (or only to reduce) the presure in auxilary reservoir of a vehicle. This provides a way to create different types of tripte valves for long-length trains (~70  vehicles), where using Train.SetVelocity() is unrealistic&lt;br /&gt;
&lt;br /&gt;
* Pass ALL keystroke information to the cab/cabin script. Currently only a subset of the keys usable are passed to the script methods meaning the cab script cannot react to all the users control requests and the range of controls is not extensible. -eldavo&lt;br /&gt;
: &#039;&#039;Please provide more information on what you want here. Which keys are you missing out on that you actually need?&#039;&#039; -chris&lt;br /&gt;
: &#039;&#039;At this time Trainz does not passes via Cabin.UserPressKey(string) large number of keyboard shortcuts defined in file Settings/keyboard.txt. This makes difficult to override default cabin implementation and defining custom functions to keys.&#039;&#039; -Mike&lt;br /&gt;
:: &#039;&#039;As above, please provide specifics. We will not be simply passing through all keyboard information because this breaks localisation support. We may be able to help with specific requests.&#039;&#039; ~chris&lt;br /&gt;
:::&#039;&#039;Marked as rejected due to lack of updates.&#039;&#039; ~chris&lt;br /&gt;
:::: &#039;&#039;train_cabin_brake_release, train_cabin_brake_lap, train_cabin_indbrake_toggle, train_cabin_dyn_toggle, etc. combinations are not passed through UserPressKey. I request to pass all strings defined in keyboard.txt file through cabin script. Also, it would be nice to have messages about pressed keys with minor string like UserPressKey parameter.&#039;&#039; ~Mike&lt;br /&gt;
&lt;br /&gt;
==Short List==&lt;br /&gt;
Requests are placed into this section by Auran if they are somewhat likely to make it into the TS2009 product. Requests from this list will be serviced by Auran as time permits.&lt;br /&gt;
&lt;br /&gt;
-&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==TS2009 Complete==&lt;br /&gt;
* Simple destructor routine, or some other method of receiving notification of the deletion of scripted objects during a Surveyor session. (In the absence of World.GetJunctionBaseList() my new junction objects are maintaining a list of fixedtrack junctions via library calls in the Init() method of each object.  Apart from using the list myself, it is intended to be returned on demand to any script making the appropriate LibraryCall.  Since I have no way of telling that an object has been deleted, I need to rescan the entire list before returning it to ensure that each object still exists, this seems a touch inefficient when it could be easily kept up to date without a complete parse) -Andi&lt;br /&gt;
:&#039;&#039;Now a function of the [[TrackSearch]] system.&#039;&#039; -chris&lt;br /&gt;
&lt;br /&gt;
* The ability for [[TrackSearch]] to return the trigger or track reference found for SceneryWithTrack descendants, including turntables and the ability to initiate a search from a specified trigger or track in SceneryWithTrack descendants.  A million reasons for this including trains being able to detect which track of an industry they can see in a proposed &#039;Call-At All Stations&#039; rule. -Andi06&lt;br /&gt;
:&#039;&#039;Now a function of the [[TrackSearch]] system.&#039;&#039; -chris&lt;br /&gt;
&lt;br /&gt;
* Compatibility of the [[TrackSearch]] with the animated fixed junctions. When I first got TRS2006 in my hands, I tried out my TrackView rule, but quickly discovered that it was impossible to find out the track topology (forgot the exact details, though) - [[User:Klausm|Klausm]]&lt;br /&gt;
:&#039;&#039;[[TrackSearch]] system is now considerably more robust.&#039;&#039; -chris&lt;br /&gt;
&lt;br /&gt;
* Extensions to TrackSearch()/GSTrackSearch() covered elsewhere to be sufficient to allow the topography of multi node junctions to be fully discovered. -Andi&lt;br /&gt;
:&#039;&#039;[[TrackSearch]] system is now considerably more robust.&#039;&#039; -chris&lt;br /&gt;
&lt;br /&gt;
*If we are going to use radians now (SetMeshOrientation()) could we please have PI?&lt;br /&gt;
:&#039;&#039;Math.PI&#039;&#039; -chris&lt;br /&gt;
&lt;br /&gt;
* Ability to configure permit structure to allow multi node junctions to coexist with the AI, whilst denying conflicting paths, as discussed above. -Andi&lt;br /&gt;
:&#039;&#039;Added named mutex support for attached junctions. See [[KIND SceneryWithTrack]].&#039;&#039; ~chris&lt;br /&gt;
&lt;br /&gt;
* Fix World.GetAssetList(&amp;quot;texture-group&amp;quot;), this has been broken since TRS2004. -Andi06&lt;br /&gt;
:&#039;&#039;Now returns all assets with category-class &#039;JO&#039;. This seems to contain all &#039;texture-group&#039; type assets - though there maybe some unexpected extras.&#039;&#039; -James&lt;br /&gt;
&lt;br /&gt;
* Ability to detect the use of &#039;Pause&#039; easily (a message would do) to stop cheating in shunting puzzles ~Jenolan&lt;br /&gt;
:&#039;&#039;New messages &amp;quot;World&amp;quot;, &amp;quot;Paused&amp;quot; and &amp;quot;World&amp;quot;, &amp;quot;Unpaused&amp;quot; now exist and should be broadcast at the appropriate times.&#039;&#039; -James&lt;br /&gt;
&lt;br /&gt;
* World.GetCurrentTrain() Not essential obviously but it would save a lot of work. -Andi06&lt;br /&gt;
:&#039;&#039;Now exists.&#039;&#039; -James&lt;br /&gt;
&lt;br /&gt;
* Ability to optionally detect mouseclick/ Keys [J] &amp;amp; [^J] without switching the junction. This can be hacked by making node 0 an invisible junction, but this will result in other objects querying the junction structure not getting the answer they expect (or not one they can understand). This is needed to allow objects with more than one junction node to cycle through their options in response to the user. -Andi&lt;br /&gt;
:&#039;&#039;I believe this is now possible via script overrides on the map object in question.&#039;&#039; ~chris&lt;br /&gt;
&lt;br /&gt;
* A method of subclassing or outright using a script from another asset (ie. a script which is written once and reused heavily, allowing any fixes to be released as a single asset update.) - chris&lt;br /&gt;
:&#039;&#039;TS2009 now has the ability to cross-include scripts from another asset.&#039;&#039; ~chris&lt;br /&gt;
&lt;br /&gt;
* Dreamland, a new message: &#039;&#039;Junction,AboutToToggle&#039;&#039; -Andi&lt;br /&gt;
: &#039;&#039;How do you expect to act on this? -chris&#039;&#039;&lt;br /&gt;
: &#039;&#039;see Animated Fixed Junctions Thread&#039;&#039;&lt;br /&gt;
::&#039;I believe this concept has been fulfilled via the UserRequestToggle overrides.&#039;&#039; ~chris&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Rejected==&lt;br /&gt;
If there&#039;s a request that we&#039;re clearly not going to entertain at the current time, we&#039;ll move it to here. This includes both flat rejections and also requests which sound good but won&#039;t be done for the next version of Trainz.&lt;br /&gt;
&lt;br /&gt;
[[Rejected Script Feature Requests]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Feature Request]]&lt;/div&gt;</summary>
		<author><name>Agentmike</name></author>
	</entry>
	<entry>
		<id>https://wiki.trainzsimulator.com/index.php?title=Rejected_Script_Feature_Requests&amp;diff=677</id>
		<title>Rejected Script Feature Requests</title>
		<link rel="alternate" type="text/html" href="https://wiki.trainzsimulator.com/index.php?title=Rejected_Script_Feature_Requests&amp;diff=677"/>
		<updated>2009-11-14T14:12:24Z</updated>

		<summary type="html">&lt;p&gt;Agentmike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is a history of [[Script Feature Requests]] that have been rejected. Each entry has a small explanation of why it was rejected.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* iTrainz Chat to work with the #trainz IRC chat room. -PerRock&lt;br /&gt;
:&#039;&#039;The iTrainz network cannot connect out to the public internet for security reasons. This means that it&#039;s not possible for scripts to connect to an IRC network. It&#039;s possible that someone could write a native bridge program that signs on to both the IRC channel and also on to iTrainz, and passes data between them, however that&#039;s not something that Auran will be spending time on. Our current focus is to improve the in-game chat UI. There&#039;s no reason that a third party could not write a bridge program once we release the [[iTrainz]] APIs.&#039;&#039; -chris&lt;br /&gt;
&lt;br /&gt;
* Ability to issue an XML-RPC Call (SOAP) for sending/getting information from a server ~Jenolan&lt;br /&gt;
:&#039;&#039;As above, we&#039;re not allowing access to the public internet for security reasons. This policy won&#039;t change in the near future. Again, it should be possible to write a native bridge once we release the APIs.&#039;&#039; -chris&lt;br /&gt;
&lt;br /&gt;
* MD5 of the serial number available for gaming support to stop Warez kiddies ~Jenolan&lt;br /&gt;
: &#039;&#039;I don&#039;t believe there&#039;s any need for this. Use the iTrainz username- it&#039;s in Auran&#039;s interests to make sure that this name is validated, it allows you to associate the request with a particular user, and it removes any need for a system to validate cd key hashes (which is a security risk in itself).&#039;&#039; -chris&lt;br /&gt;
&lt;br /&gt;
* Menu control, ability to have menus that run other assets (Activities) or chain to another menu asset, also ability to chain to a menu from an Activity ~Jenolan&lt;br /&gt;
: &#039;&#039;As discussed, this is an Auran-driven request which I&#039;m hoping will make it onto the TS2009 schedule. It doesn&#039;t need to be repeated here.&#039;&#039; - chris&lt;br /&gt;
: The need is still there, and activity/menu chaining so long as we get it :)&lt;br /&gt;
&lt;br /&gt;
* Ability to control pitch modifying sound introduced in TC (was via a config.txt entry) but in some form of a script command for more realistic and complex application. Something that would not necessarly be limited to train speed but instead multiple sound files pitched at a script controlled level by the creator. -SV&lt;br /&gt;
: &#039;&#039;Too performance-heavy. This is something that would need to be updated per frame and as such is not a candidate for script control.&#039;&#039; -chris&lt;br /&gt;
&lt;br /&gt;
* Ability to change the users screen resolution ~Jenolan&lt;br /&gt;
: &#039;&#039;This is something that the user controls; giving the script control would have minimal benefit and could lead to a very poor user experience. It&#039;s also a lot of work.&#039;&#039; -chris&lt;br /&gt;
&lt;br /&gt;
* Conditional includes:&lt;br /&gt;
 if (Trainz.GetVersion() &amp;gt;= 2.5)&lt;br /&gt;
 {&lt;br /&gt;
   // compile this only if actually included&lt;br /&gt;
   include(&amp;quot;trs2006.gs&amp;quot;)&lt;br /&gt;
 }&lt;br /&gt;
 else&lt;br /&gt;
 {&lt;br /&gt;
   // compile this only if actually included&lt;br /&gt;
   include(&amp;quot;trs2004.gs&amp;quot;)&lt;br /&gt;
 }&lt;br /&gt;
:This came up when getting handles on a vehicle bogies.  This can only be done by undocumented methods in 2004 but 2006 has GetBogeyList(). Since the script involved was for both versions I had to use undocumented methods in 2006 also. -Andi06&lt;br /&gt;
: &#039;&#039;This is a good idea, however it is impractical for us to implement at the current time.&#039;&#039; -chris&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* When I made some considerations about a better signalling system, one major problem was that there is no real support for a fundamental component of real world signalling: track circuits. However, while triggers do have similar properties, it is not acceptable for a layout designer to cover the rails with triggers, especially as the radius is not visually exposed. It is probably going too far, but a new editor tool allowing the subdivision of the track into sections, which then operate similar to triggers, would be a plus. Alternatively, allowing triggers to work like axle counters (i.e. radius 0 and reporting the direction as well) would solve this. - [[User:Klausm|Klausm]]&lt;br /&gt;
:&#039;&#039;Triggers are not intended for signalling support, so you&#039;ll probably find that any signalling system based around them will be inadequate. Please review the [[TrackSearch]] documentation and let me know if there&#039;s any functionality missing that you require.&#039;&#039; -chris&lt;br /&gt;
: &#039;&#039;Marked as rejected due to lack of updates.&#039;&#039; -chris&lt;br /&gt;
:: sorry, I have other duties. TrackSearch is nice, but has two major drawbacks: first, you need to poll continuously/periodically for all sections to be monitored instead of being notified by a message; second, when hitting junctions, you only see one path, depending on the position of the junction, which would require even more TrackSearches to be done. Btw., the Track object could take over the functionality BUT their existence is intrinsic and not user editable (except by adding junctions). - [[User:Klausm|Klausm]]&lt;br /&gt;
::: &#039;&#039;Signals do not need to poll; they have a single entrypoint which is called from native code, and they should perform a full update when this call is made. In TS2009, the native code does not poll this function, so you only have to worry about your instantaneous performance cost, not an ongoing cost.&#039;&#039; ~chris&lt;br /&gt;
:::: My &#039;&#039;personal&#039;&#039; interest is to manage the signalling logic &#039;&#039;outside&#039;&#039; of the signals, as in my humble opinion &#039;&#039;fully&#039;&#039; prototypical signalling cannot be implemented otherwise. It needs a global view and a global controller instead of the local view of each signal. I don&#039;t know whether such functionality is in the interest of Auran and/or the community, as such I respect the decision for the requested features not being made available. - [[User:Klausm|Klausm]]&lt;br /&gt;
::::: The major problem in going to a fully &#039;&#039;proto&#039;&#039; signalling system isn&#039;t centralised or localised control - this is just programming style. IMHO Localised control can give the appearance of centralised control to the driver with careful coding, while maintaining the benefits of seamless automatic configuration. The most important step towards going fully &#039;&#039;proto&#039;&#039; would be deliberately not clearing a controlled signal until the track beyond (right up to the next signal) has permits granted for the approaching train. From the signalling perspective, it&#039;s not that difficult. Inspect the track, check it all has permits granted, make sure all the junction levers are locked. Unfortunately this would require major surgery on the AI, and a rethink of how a human drives a train too, as neither would be able to get past a junction if the signalling system did this... -James&lt;br /&gt;
::::: &#039;&#039;To continue on from James&#039; comments, TS2009 custom signalling requires the use of Signal scripts. You may implement a library which coordinates state between signals if you choose, however there is no mechansim for doing away with Signals completely.&#039;&#039; ~chris&lt;br /&gt;
&lt;br /&gt;
* Need to be able to do an MD5 for various purposes, eg String.MD5( &amp;quot;TEXT&amp;quot; ) not just for password (ours) over iTrainz but also as a log check. ~Jenolan&lt;br /&gt;
: &#039;&#039;You can implement this yourself in script. I don&#039;t feel that there is sufficient reuse potential to warrant us doing an implementation.&#039;&#039; -chris&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Ability to add/remove or hide/show scenery items ~Jenolan&lt;br /&gt;
: &#039;&#039;This sounds like it&#039;s possible already. What did you want changed here exactly? ~chris&#039;&#039;&lt;br /&gt;
: &#039;&#039;Marked as rejected due to lack of updates.&#039;&#039; -chris&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Add messages about keyboard keys pressed. This will allow to use hotkeys not only for cab scripts, but also for junctions, signalling, various session rules etc. -Mike&lt;br /&gt;
: &#039;&#039;We will not be simply passing through all keyboard information because this breaks localisation support. Specific key input requirements may be requested, but we will not be providing a generalised solution to this at the current time.&#039;&#039; ~chris&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Ability to remap keys via script. As far as i know, the mapping of keys cannot be done right now. One can only listen to messages coming from keys that are already mapped by TRS (like throttle up or throttle down) wich greatly limits our choices (unless there is some other way i dont know of). So the ability to remap keys via script.&lt;br /&gt;
:&#039;&#039;See above response.&#039;&#039; ~chris&lt;/div&gt;</summary>
		<author><name>Agentmike</name></author>
	</entry>
	<entry>
		<id>https://wiki.trainzsimulator.com/index.php?title=%22Mass%22_container&amp;diff=591</id>
		<title>&quot;Mass&quot; container</title>
		<link rel="alternate" type="text/html" href="https://wiki.trainzsimulator.com/index.php?title=%22Mass%22_container&amp;diff=591"/>
		<updated>2008-12-19T13:36:23Z</updated>

		<summary type="html">&lt;p&gt;Agentmike: /* Supported Tags */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Mass container is a top-level [[config.txt file]] entry used by [[KIND Engine|Enginespec]] and [[KIND Steam-engine|Steam Enginespec]] assets.&lt;br /&gt;
&lt;br /&gt;
==Supported Tags==&lt;br /&gt;
&lt;br /&gt;
The Mass container supports the following tags. Each tag is show here with its default value.&lt;br /&gt;
&lt;br /&gt;
 mass&lt;br /&gt;
 {&lt;br /&gt;
     scale 1.0&lt;br /&gt;
     fuel 6.215e+066&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
====scale====&lt;br /&gt;
:Type: Decimal&lt;br /&gt;
:Desc: &lt;br /&gt;
&lt;br /&gt;
====fuel====&lt;br /&gt;
:Type: Decimal&lt;br /&gt;
:Desc:&lt;br /&gt;
&lt;br /&gt;
==Example mass container==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;TBD&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Category:Config Container]]&lt;/div&gt;</summary>
		<author><name>Agentmike</name></author>
	</entry>
	<entry>
		<id>https://wiki.trainzsimulator.com/index.php?title=Wiki_Feature_Requests&amp;diff=911</id>
		<title>Wiki Feature Requests</title>
		<link rel="alternate" type="text/html" href="https://wiki.trainzsimulator.com/index.php?title=Wiki_Feature_Requests&amp;diff=911"/>
		<updated>2008-09-08T18:51:22Z</updated>

		<summary type="html">&lt;p&gt;Agentmike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;*Reduce the size of the banner please - screen space is valuable, preferably keep it in the left hand frame, much more stylish. ~Andi&lt;br /&gt;
*Fix external links so that they open a new page. ~Andi&lt;br /&gt;
*Can we arrange things so that the recent page history drop downs show the page title as well as just saying TrainzDev. ~Andi&lt;br /&gt;
*Can the logon timeout be extended? ~Andi&lt;br /&gt;
*WIKI Search link at the top of each page?  WIKI search is a first class tool and its starting to return useful results.&lt;br /&gt;
*Lot of Feature Request are bugs in previous versions, what about BugZilla or something similar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Categories==&lt;br /&gt;
[[Category:Feature Request]]&lt;/div&gt;</summary>
		<author><name>Agentmike</name></author>
	</entry>
</feed>