https://wiki.ntbigroup.com/api.php?action=feedcontributions&user=NelsonJenkins&feedformat=atomNTBI - User contributions [en]2024-03-28T21:39:08ZUser contributionsMediaWiki 1.31.0https://wiki.ntbigroup.com/index.php?title=Global_License_Plate_System&diff=2962Global License Plate System2021-05-02T23:37:08Z<p>NelsonJenkins: </p>
<hr />
<div>The '''Global License Plate System (GLPS)''' is a free, open-source license plate system maintained by the NTBI Group. Anyone can attach a GLPS license plate onto their own vehicle and sell their vehicle with GLPS license plates installed.<br />
<br />
==Overview==<br />
GLPS is the combination of a full-permissions model, script, PSD files, and web API. While designed for vehicle manufacturers, GLPS plates can be installed on any modifiable vehicle by simply linking them to the vehicle object.<br />
<br />
GLPS is designed to overcome formatting issues with license plates previously used on NTBI vehicles and those created by some other manufacturers. On those models, characters shown on the plate had to be displayed where the individual character faces were positioned on the model. Instead, GLPS uses an innovative text rendering technique that allows characters to be displayed effectively anywhere on the plate at any size while still using only one texture per font. This also allows GLPS plates to be resized automatically between US/Japan and UK/Euro sizes without needing to duplicate the entire plate for another size, because fonts can be changed and characters can be moved and scaled appropriately for each plate size and design.<br />
<br />
<big>[https://marketplace.secondlife.com/p/GLPS-Development-Kit-Full-Perm-Global-License-Plate-System-Plate/20803261 '''Click here''' for the GLPS developer kit.]</big><br />
<br />
<big>[https://ntbigroup.com/TEMPLATES/GLPS%20TEMPLATE%20JP%20US.psd '''Click here''' for the GLPS JP/US sized custom texture PSD.]</big><br />
<br />
<big>[https://ntbigroup.com/TEMPLATES/GLPS%20TEMPLATE%20EU%20RU%20UK.psd '''Click here''' for the GLPS EU/RU/UK sized custom texture PSD.]</big><br />
<br />
<big>For a list of default templates, scroll to the bottom of the page.</big><br />
<br />
==Compatible Vehicles==<br />
GLPS is being integrated into NTBI vehicles on a rolling basis. However, since GLPS is a free standard, other manufacturers may also implement GLPS on their vehicles.<br />
<br />
==Instructions==<br />
GLPS is very simple to install and use - see the instructions below.<br />
<br />
===For End-Users===<br />
Each manufacturer implements GLPS differently, so refer to your vehicle's owners guide.<br />
<br />
Most vehicles allow you to set a plate by navigating the vehicle's configuration menu.<br />
<br />
If you are developing your own vehicle, or for some reason you cannot access the GLPS configuration menu, drop the ''NTBI GLPS Configuration Tool'' script into the vehicle. It will send the command to open the GLPS configuration menu and immediately delete itself.<br />
<br />
===For Vehicle Developers===<br />
Follow the instructions at the top of the script inside the plate to set it up for your vehicle.<br />
<br />
GLPS plates can be configured two ways - either by sending a command that causes the plate to send the user the GLPS configuration menu, or by sending configuration information directly to the plate.<br />
<br />
To trigger the GLPS configuration menu for the owner, use:<br />
<br />
llMessageLinked(LINK_SET, 0, "GLPS_OPEN_MENU", "");<br />
<br />
To set the plate number, use:<br />
<br />
llMessageLinked(LINK_SET, 0, "GLPS_SET_NUMBER", "[plate number]");<br />
<br />
To load a template directly, use:<br />
<br />
llMessageLinked(LINK_SET, 0, "GLPS_LOAD_TEMPLATE", "[template code]");<br />
<br />
To request the current GLPS config, use:<br />
<br />
llMessageLinked(LINK_SET, 0, "GLPS_GET_DATA", "");<br />
<br />
This will return:<br />
<br />
llMessageLinked(LINK_SET, 0, "GLPS_GOT_DATA", "[JSON object of GLPS config]");<br />
<br />
To load a GLPS config, use:<br />
<br />
llMessageLinked(LINK_SET, 0, "GLPS_LOAD_DATA", "[JSON object of GLPS config]");<br />
<br />
You may also want to set the current template ID using:<br />
<br />
llMessageLinked(LINK_SET, 0, "GLPS_SET_TEMPLATE_ID", "[template code]");<br />
<br />
Note that this will not actually load the template, but can be used to force the template code into memory.<br />
<br />
===For Roleplay Managers and Other Developers===<br />
GLPS plates can be "read" using a chat command, which facilitates simulated ALPR cameras. Communication to the plate is performed on a pseudo-random channel, and communication back to the reader is sent on channel 2250. The command is as follows:<br />
<br />
key vehicle_key = llDetectedKey(0); // this key can be obtained any way you want<br />
llRegionSay(-1 - (integer)("0x" + llGetSubString((string)vehicle_key, -7, -1)), "GLPS_SCAN|" + (string)vehicle_key);<br />
<br />
The response, sent to channel 2250, will be:<br />
<br />
GLPS_SCANNED|[vehicle_key]|[template code]|[plate number]<br />
<br />
<code>[template code]</code> is the code of the default template, if used. If the plate has any modifications, or is using a custom code, <code>[template code]</code> will be "XXXXX".<br />
<br />
==Frequently Asked Questions==<br />
<br />
=====Can I change the number on my plate?=====<br />
<br />
Yes. Open the GLPS configuration menu and select ''Number...'', then enter your desired number. Note that for some plates, such as the default Second Life US-style plate, only a specific number of characters can be entered.<br />
<br />
=====Can I change the plate design/template to something else?=====<br />
<br />
Yes. Open the GLPS configuration menu and select ''Templates...'' -> ''Load...'', then enter the template code of the template you want to use. The template code will load a plate texture, layout, and font. Scroll down for a list of public template codes.<br />
<br />
=====Can I use my own plate textures?=====<br />
<br />
Yes. Open the GLPS configuration menu and select ''Templates...'' -> ''Customize...'' -> ''Texture...'', then paste the texture UUID in the text box. Then, if prompted, select whether you want to apply that texture to the ''Front'', ''Back'', or ''Both'' plates. Then select ''Layout...'' and apply a default layout or change the layout as needed to fit the texture. Then, if desired, select ''Font...'' and select your desired font.<br />
<br />
=====My plate texture already has numbers on it, can I still use it?=====<br />
<br />
Yes. Open the GLPS configuration menu and select ''Number...'' -> ''Clear Number'', then follow the instructions above to use a custom texture UUID.<br />
<br />
=====Why does my plate use an invalid combination of letters and numbers for my state/country? <br>Why does the Japanese plate not use only numbers? <br>Why does the hiragana character on the Japanese plate not match the vehicle type?=====<br />
<br />
Due to how GLPS works, plates are issued semi-randomly using both letters and numbers regardless of whether that would be an appropriate combination in real life for each jurisdiction and vehicle type. If you like, you can change the number to something appropriate.<br />
<br />
=====My country isn't included among the default templates, how do I add it?=====<br />
<br />
Download the PSD file and design a template in Photoshop, or use someone else's template.<br />
<br />
Note that GLPS plates are limited to 7 characters, so some plates (such as those issued in Russia) cannot be rendered fully.<br />
<br />
Note also that characters on GLPS plates are flexible but generally cannot be made small enough to be stacked on top of each other, as seen on certain US specialty plates. Therefore, if you are making a specialty plate template that uses two characters stacked on top of each other, we recommend that you include those characters directly on the template if possible.<br />
<br />
Finally, keep in mind that GLPS can only display 0-9, A-Z, certain Japanese hiragana (see below), and the following special characters: -.: GLPS cannot display registration or inspection stickers, other special characters, or non-English characters.<br />
<br />
If you design a real-life plate template that is not in the default templates, send an IM to Nelson Jenkins and we will review it to see if it would be appropriate to add to the default templates. Note that we will only add templates that are effectively identical to real-life plates.<br />
<br />
=====Why do you call them "license plates" and not "registration plates" or "number plates"?=====<br />
<br />
Because the person who developed GLPS is an American. Sorry.<br />
<br />
=====What plate sizes are available?=====<br />
<br />
GLPS includes, by default, 12x6 inch (305x152 mm) plates for Japan/US and 520x130 mm plates for Europe/Russia/UK. Other sizes may be available for specific jurisdictions, but these two sizes are the only ones that we provide PSDs for.<br />
<br />
Some trivia as to why the UK/Europe GLPS size is not accurate: all US states and Canadian provinces managed to agree on a reasonable, delightfully proportional 12x6 inch standard all the way back in 1956, which fits perfectly onto a 512x256 px texture. Europe, meanwhile, mostly uses 520x110 mm or 520x120 mm plates with horrendous 52:11 and 13:3 aspect ratios, with many countries using completely different sizes for no clear reason, including some even using the 12x6 inch format. Because of this, GLPS also bucks the trend with a "standard" 520x130 mm plate to facilitate the use of a 512x128 px texture.<br />
<br />
=====Are motorcycle plates available?=====<br />
<br />
While GLPS does not include any templates for smaller motorcycle plates, you may create your own using the PSD file and instructions above. However, it will be difficult if not impossible to render characters in two rows as seen on most European motorcycle plates due to technical limitations of the font textures.<br />
<br />
=====What information is stored by the GLPS web API?=====<br />
<br />
The GLPS API, hosted by Northbridge Business Systems, only stores the plate template (design only, no text) and plate owner's UUID when copying a plate template code. This data is not available to the public and is only used for detecting abuse of the template code generation service. This service is necessary because plate configurations are very long and are not easy to load into the plate manually. GLPS does not store any information about the vehicle, such as its position, speed, driver, or model, except for the vehicle owner's UUID as a consequence of storing the plate owner's UUID.<br />
<br />
=====Why is an NBS API key required?=====<br />
The GLPS API hosts saved plate data as described above. There is currently no limit to the number of plates any one person can save. To allow NBS to monitor the system for abuse, an NBS API key is required for calls that either read or store custom plate data.<br />
<br />
=====How are default plate numbers assigned?=====<br />
<br />
Plate numbers are generated as seven-digit strings, and if the plate template cannot display seven digits, only the first digits are displayed up to the maximum. The first two characters are random alphanumeric characters, the third character is the first character of the region name that the car is first rezzed in, the fourth through sixth characters are the last three digits of the current Unix timestamp, and the last character is a random alphanumeric character.<br />
<br />
=====Are plate numbers unique or searchable?=====<br />
<br />
No. Due to privacy concerns, we chose to make plate numbers pseudo-random and they might not be unique. However, plate numbers only change when the vehicle owner changes or the plate is edited by the user, so plate numbers will persist even if the vehicle is taken and re-rezzed.<br />
<br />
=====Why is the layout/font not accurate for my state/country?=====<br />
<br />
We have tried to implement as many plate designs as we could, but the person who developed GLPS is a stupid American, so many of the European plates are wrong because we do not have access to every accurate font, and we do not have the time to make sure every state plate is pixel-perfect. Different states and countries use a wide variety of fonts, layouts, decals, additional stickers, and sizes. We have attempted to emulate these formats, but the layout and font may not be completely accurate in every case.<br />
<br />
=====For European plates with inspection stickers, can they be changed?=====<br />
<br />
While you are welcome to make your own inspection sticker, the sticker on the template is the only inspection sticker possible by default. We have thus attempted to avoid referring to any specific year on the default templates.<br />
<br />
=====For Russian plates, can the region number be changed to not say "SL"?=====<br />
<br />
No. Due to the fact that GLPS can only render 7 characters, the region code was replaced with "SL", but you can edit the default template to set a custom region number if you like.<br />
<br />
=====What does the Japanese plate say at the top?=====<br />
<br />
The kanji at the top reads "import" and the number to the right is the vehicle class code, which is estimated depending on the plate type you use, but can be edited (see above). Realistically, the kanji would indicate the local office that issued the plate, but incorporating all of the possible office codes would make the characters unreadable. For more information, [https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Japan see the relevant Wikipedia article.] It is also possible that the kanji reads something totally nonsensical or that we glossed over an appropriate real-life alternative that could have been used, since the person who developed GLPS is a baka gaijin.<br />
<br />
=====For Japanese plates, can I change the issuing office and class codes at the top of the plate?=====<br />
<br />
Yes, but this can only be done by making your own texture using the PSD file in Photoshop. Due to Second Life limitations, only the hiragana character and sequential digits can be changed in-world.<br />
<br />
=====For Japanese plates, how do I display dots instead of leading zeroes?=====<br />
<br />
Use ":" (the colon punctuation mark) for each centered dot.<br />
<br />
=====For Japanese plates, how do I enter the hiragana character?=====<br />
<br />
GLPS will accept hiragana in the number input. Alternatively, you can use the following romanji and punctuation that are mapped to the following hiragana:<br />
<br />
{| class="wikitable" style="text-align:center;"<br />
|-<br />
! 0 || 1 || 2 || 3 || 4 || 5 || 6 || 7 || 8 || 9 || A || B || C || D || E || F || G || H || I || J<br />
|-<br />
| さ || す || せ || そ || た || ち || つ || て || と || な || に || ぬ || ね || の || は || ひ || ふ || ほ || ま || み<br />
|-<br />
! K || L || M || N || O || P || Q || R || S || T || U || V || W || X || Y || Z || - || . || : || @<br />
|-<br />
| む || め || も || や || ゆ || よ || ら || り || る || ろ || あ || い || う || え || か || き || く || け || こ || を<br />
|}<br />
<br />
Note that the hiragana mapped to 0-9 and A-T are used on private vehicles and those mapped to U-Z and punctuation are used on commercial vehicles, though due to the nature of GLPS, these combinations are not always accurate. Also, GLPS does not support the れ and わ "rental vehicle" hiragana due to space limitations, and does not support any of the following hiragana not valid on license plates: 'ばだがぱざびぢぎぴじぶづぐぷずべでげペぜぼどごぽぞゑゐ<br />
<br />
==Default Templates==<br />
<br />
Below is a list of default template codes:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Code || Size || Digits || Description<br />
|-<br />
| GLPSD/SLUSS || JP/US || 6 || Second Life Default (US Style)<br />
|-<br />
| GLPSD/SLUSV || JP/US || 1-7 || Second Life Vanity (US Style)<br />
|-<br />
| GLPSD/SLMBE || JP/US || 1-7 || Second Life Mainland - Bellisseria<br />
|-<br />
| GLPSD/SLMBS || JP/US || 1-7 || Second Life Mainland - Blake Sea<br />
|-<br />
| GLPSD/SLMCO || JP/US || 1-7 || Second Life Mainland - Corsica<br />
|-<br />
| GLPSD/SLMGI || JP/US || 1-7 || Second Life Mainland - Gaeta Islands<br />
|-<br />
| GLPSD/SLMHE || JP/US || 1-7 || Second Life Mainland - Heterocera<br />
|-<br />
| GLPSD/SLMJE || JP/US || 1-7 || Second Life Mainland - Jeogeot<br />
|-<br />
| GLPSD/SLMNA || JP/US || 1-7 || Second Life Mainland - Nautilus<br />
|-<br />
| GLPSD/SLMSA || JP/US || 1-7 || Second Life Mainland - Sansara<br />
|-<br />
| GLPSD/SLMST || JP/US || 1-7 || Second Life Mainland - Satori<br />
|-<br />
| GLPSD/SLMSC || JP/US || 1-7 || Second Life Mainland - Sharp Continent<br />
|-<br />
| GLPSD/SLMZI || JP/US || 1-7 || Second Life Mainland - Zindra<br />
|-<br />
| GLPSD/JPPSS || JP/US || 5 || Japan - Private<br />
|-<br />
| GLPSD/JPPKS || JP/US || 5 || Japan - Private Kei<br />
|-<br />
| GLPSD/JPCSS || JP/US || 5 || Japan - Commercial<br />
|-<br />
| GLPSD/JPCKS || JP/US || 5 || Japan - Commercial Kei<br />
|-<br />
| GLPSD/JPTPS || JP/US || 5 || Japan - Temporary<br />
|-<br />
| GLPSD/USCAS || JP/US || 1-7 || United States - California<br />
|-<br />
| GLPSD/USCAB || JP/US || 1-7 || United States - California (Black)<br />
|-<br />
| GLPSD/USNJS || JP/US || 6 || United States - New Jersey<br />
|-<br />
| GLPSD/USNJV || JP/US || 1-7 || United States - New Jersey Vanity<br />
|-<br />
| GLPSD/USNYS || JP/US || 7 || United States - New York<br />
|-<br />
| GLPSD/USNYV || JP/US || 1-7 || United States - New York Vanity<br />
|-<br />
| GLPSD/USNYA || JP/US || 7 || United States - New York (2010s)<br />
|-<br />
| GLPSD/USNYB || JP/US || 1-7 || United States - New York Vanity (2010s)<br />
|-<br />
| GLPSD/USNYC || JP/US || 1-7 || United States - New York Livery (2010s)<br />
|-<br />
| GLPSD/USNYD || JP/US || 1-7 || United States - New York T&LC (2010s)<br />
|-<br />
| GLPSD/USNYE || JP/US || 7 || United States - New York (2000s)<br />
|-<br />
| GLPSD/USNYF || JP/US || 1-7 || United States - New York Vanity (2000s)<br />
|-<br />
| GLPSD/USNYG || JP/US || 1-7 || United States - New York Livery (2000s)<br />
|-<br />
| GLPSD/USNYH || JP/US || 1-7 || United States - New York T&LC (2000s)<br />
|-<br />
| GLPSD/USNYI || JP/US || 6 || United States - New York (1990s)<br />
|-<br />
| GLPSD/USNYJ || JP/US || 6 || United States - New York Vanity (1990s)<br />
|-<br />
| GLPSD/USNYK || JP/US || 6 || United States - New York Livery (1990s)<br />
|-<br />
| GLPSD/USNYL || JP/US || 6 || United States - New York T&LC (1990s)<br />
|-<br />
| GLPSD/USNYM || JP/US || 6 || United States - New York Commercial (1990s)<br />
|-<br />
| GLPSD/USPAS || JP/US || 7 || United States - Pennsylvania<br />
|-<br />
| GLPSD/USPAV || JP/US || 1-7 || United States - Pennsylvania Vanity<br />
|-<br />
| GLPSD/USTXS || JP/US || 7 || United States - Texas<br />
|-<br />
| GLPSD/USTXV || JP/US || 1-7 || United States - Texas Vanity<br />
|-<br />
| GLPSD/SLEUS || EU/RU/UK || 1-7 || Second Life Default (EU Style)<br />
|-<br />
| GLPSD/EUALS || EU/RU/UK || 7 || Albania<br />
|-<br />
| GLPSD/EUAAS || EU/RU/UK || 6 || Austria<br />
|-<br />
| GLPSD/EUBYS || EU/RU/UK || 7 || Belarus<br />
|-<br />
| GLPSD/EUBBS || EU/RU/UK || 7 || Belgium<br />
|-<br />
| GLPSD/EUBIS || EU/RU/UK || 7 || Bosnia and Herzegovina<br />
|-<br />
| GLPSD/EUBGS || EU/RU/UK || 7 || Bulgaria<br />
|-<br />
| GLPSD/EUHRS || EU/RU/UK || 7 || Croatia<br />
|-<br />
| GLPSD/EUCZS || EU/RU/UK || 7 || Czech Republic<br />
|-<br />
| GLPSD/EUDKS || EU/RU/UK || 7 || Denmark<br />
|-<br />
| GLPSD/EUDKC || EU/RU/UK || 7 || Denmark - Commercial<br />
|-<br />
| GLPSD/EUDKP || EU/RU/UK || 7 || Denmark - "Parrot"<br />
|-<br />
| GLPSD/EUESS || EU/RU/UK || 6 || Estonia<br />
|-<br />
| GLPSD/EUFIS || EU/RU/UK || 6 || Finland<br />
|-<br />
| GLPSD/EUFFS || EU/RU/UK || 7 || France<br />
|-<br />
| GLPSD/EUDDS || EU/RU/UK || 7 || Germany<br />
|-<br />
| GLPSD/EUGRS || EU/RU/UK || 7 || Greece<br />
|-<br />
| GLPSD/EUHHS || EU/RU/UK || 6 || Hungary<br />
|-<br />
| GLPSD/EUISS || EU/RU/UK || 5 || Iceland<br />
|-<br />
| GLPSD/EUIRS || EU/RU/UK || 7 || Ireland<br />
|-<br />
| GLPSD/EUIIS || EU/RU/UK || 7 || Italy<br />
|-<br />
| GLPSD/EULVS || EU/RU/UK || 6 || Latvia<br />
|-<br />
| GLPSD/EULIS || EU/RU/UK || 7 || Liechtenstein<br />
|-<br />
| GLPSD/EULTS || EU/RU/UK || 6 || Lithuania<br />
|-<br />
| GLPSD/EULLS || EU/RU/UK || 6 || Luxembourg<br />
|-<br />
| GLPSD/EUMMS || EU/RU/UK || 6 || Malta<br />
|-<br />
| GLPSD/EUMDS || EU/RU/UK || 6 || Moldova<br />
|-<br />
| GLPSD/EUMNS || EU/RU/UK || 7 || Montenegro<br />
|-<br />
| GLPSD/EUNLS || EU/RU/UK || 6 || Netherlands<br />
|-<br />
| GLPSD/EUNMS || EU/RU/UK || 7 || North Macedonia<br />
|-<br />
| GLPSD/EUNNS || EU/RU/UK || 7 || Norway<br />
|-<br />
| GLPSD/EUPLS || EU/RU/UK || 7 || Poland<br />
|-<br />
| GLPSD/EUPPS || EU/RU/UK || 6 || Portugal<br />
|-<br />
| GLPSD/EUROS || EU/RU/UK || 7 || Romania<br />
|-<br />
| GLPSD/EUSRS || EU/RU/UK || 7 || Serbia<br />
|-<br />
| GLPSD/EUSKS || EU/RU/UK || 7 || Slovakia<br />
|-<br />
| GLPSD/EUSLS || EU/RU/UK || 7 || Slovenia<br />
|-<br />
| GLPSD/EUEES || EU/RU/UK || 7 || Spain<br />
|-<br />
| GLPSD/EUSSS || EU/RU/UK || 6 || Sweden<br />
|-<br />
| GLPSD/EUUAS || EU/RU/UK || 7 || Ukraine<br />
|-<br />
| GLPSD/RURUS || EU/RU/UK || 6 || Russia<br />
|-<br />
| GLPSD/UKUKS || EU/RU/UK || 7 || United Kingdom (Front/Rear)<br />
|-<br />
| GLPSD/UKEUS || EU/RU/UK || 7 || United Kingdom EU (Front/Rear)<br />
|-<br />
| GLPSD/THPCS || Custom || 6 || Thailand - Private Car<br />
|-<br />
| GLPSD/THPVS || Custom || 6 || Thailand - Private Van<br />
|-<br />
| GLPSD/THPPS || Custom || 6 || Thailand - Private 2DR Pickup<br />
|-<br />
| GLPSD/THPTS || Custom || 6 || Thailand - Private Motorized Tricycle<br />
|-<br />
| GLPSD/THTCS || Custom || 6 || Thailand - Taxi<br />
|-<br />
| GLPSD/THSCS || Custom || 6 || Thailand - Service Vehicle<br />
|}<br />
<br />
==Default Fonts==<br />
<br />
Below is a list of default font codes:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Code || Description<br />
|-<br />
| US1 || United States - Generic 1<br />
|-<br />
| US2 || United States - Generic 2<br />
|-<br />
| USCA || United States - California<br />
|-<br />
| USFL || United States - Florida<br />
|-<br />
| USIL || United States - Illinois<br />
|-<br />
| USMA || United States - Massachusetts<br />
|-<br />
| USMD || United States - Maryland<br />
|-<br />
| USMI || United States - Michigan<br />
|-<br />
| USMO || United States - Missouri<br />
|-<br />
| USNC || United States - North Carolina<br />
|-<br />
| USNJ || United States - New Jersey<br />
|-<br />
| USNY || United States - New York<br />
|-<br />
| USOH || United States - Ohio<br />
|-<br />
| USPA || United States - Pennsylvania<br />
|-<br />
| USVA || United States - Virginia<br />
|-<br />
| USWA || United States - Washington<br />
|-<br />
| USWI || United States - Wisconsin<br />
|-<br />
| CAON || Canada - Ontario<br />
|-<br />
| CAQC || Canada - Quebec<br />
|-<br />
| UK || United Kingdom<br />
|-<br />
| EU1 || Europe - Generic 1<br />
|-<br />
| EU2 || Europe - Generic 2<br />
|-<br />
| EU3 || Europe - Generic 3<br />
|-<br />
| JPR || Japan - Romaji/Numerals<br />
|-<br />
| JPH || Japan - Hiragana<br />
|}<br />
<br />
==Changelog==<br />
Rev. 3<br />
* Fixed stack-heap collision when loading certain templates.<br />
Rev. 2<br />
* Fixed current prim height/width being displayed incorrectly in menu.<br />
* Fixed prim height/width being prompted for in millimeters but being applied as meters.<br />
* Fixed rare issue when changing colors that caused copying plate via API to return invalid_api_key.<br />
Rev. 1<br />
* Added ability to change minimum and maximum characters on template.<br />
* Fixed GLPS plate scanning API.<br />
Rev. 0<br />
* Initial public release.</div>NelsonJenkinshttps://wiki.ntbigroup.com/index.php?title=Templates&diff=2961Templates2021-04-26T01:36:22Z<p>NelsonJenkins: </p>
<hr />
<div>The following templates are available for NTBI products:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Product Name !! Diffuse (base) !! Normal (bumpmap) !! Specular (reflective)<br />
|-<br />
| [[Astaro Eastman]] || [https://ntbigroup.com/TEMPLATES/ASTARO/eastmanliverytemplate.psd Truck PSD]<br>[https://ntbigroup.com/TEMPLATES/ASTARO/boxtrailertemplate.psd Box Trailer PSD]<br>[https://ntbigroup.com/TEMPLATES/ASTARO/flatbedtrailertemplate.psd Flatbed Trailer PSD]<br>[https://ntbigroup.com/TEMPLATES/ASTARO/tankertrailertemplate.psd Tanker Trailer PSD] || N/A || N/A<br />
|-<br />
| [[Astaro Imperial]] || [https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIliverydecaltemplate.psd Livery Decal PSD] [https://wiki.ntbigroup.com/images/4/49/NTBIliverydecaltemplatePNG.png PNG] || N/A || N/A<br />
|-<br />
| [[Astaro LFT-30|Astaro LFT-30 Light Tank]] || [https://ntbigroup.com/TEMPLATES/TANKTEMPLATE1.psd Main PSD]<br>[https://ntbigroup.com/TEMPLATES/TANKTEMPLATE2.psd Details PSD] || N/A || N/A<br />
|-<br />
| [[Astaro Stratum]] || [https://ntbigroup.com/TEMPLATES/ASTARO/stratumoutsidetemplate.psd Main PSD]<br>[https://ntbigroup.com/TEMPLATES/ASTARO/pizzasign.psd Pizza Sign PSD]<br>[https://ntbigroup.com/TEMPLATES/ASTARO/tunerparts.psd Tuner Parts PSD] || N/A || N/A<br />
|-<br />
| [[TPF-1 Engine|Astaro TPF-1 Engine]] || [https://ntbigroup.com/TEMPLATES/FIRE/EngineFront1.psd Front PSD]<br>[https://ntbigroup.com/TEMPLATES/FIRE/EngineBack1.psd Rear PSD]<br>[https://wiki.ntbigroup.com/images/c/c9/Enginefrontdecal.png Front Decal PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG] || N/A || N/A<br />
|-<br />
| [[TPF-2 Tanker|Astaro TPF-2 Tanker]] || [https://ntbigroup.com/TEMPLATES/FIRE/TankerFront1.psd Front PSD]<br>[https://ntbigroup.com/TEMPLATES/FIRE/TankerBack1.psd Rear PSD]<br>[https://wiki.ntbigroup.com/images/c/c9/Enginefrontdecal.png Front Decal PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG] || N/A || N/A<br />
|-<br />
| [[TPF-3 Ladder|Astaro TPF-3 Ladder]] || [https://ntbigroup.com/TEMPLATES/FIRE/EngineFront1.psd Front PSD]<br>[https://ntbigroup.com/TEMPLATES/FIRE/LadderBack1.psd Rear PSD]<br>[https://wiki.ntbigroup.com/images/7/7e/Tankersidedecal.png Side Decal PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG] || N/A || N/A<br />
|-<br />
| [[TPF-4 Ambulance|Astaro TPF-4 Ambulance]] || [https://ntbigroup.com/TEMPLATES/FIRE/TPF4%20Template%20Front.psd Front PSD] [https://ntbigroup.com/TEMPLATES/FIRE/TPF4%20Template%20FrontGIMP.xcf XCF (GIMP)]<br>[https://ntbigroup.com/TEMPLATES/FIRE/TPF4%20Template%20Back.psd Rear PSD] [https://ntbigroup.com/TEMPLATES/FIRE/TPF4%20Template%20BackGIMP.xcf XCF (GIMP)] || N/A || N/A<br />
|-<br />
| [[Lusch Motors Allstar]] || [[Lusch Motors templates|See here]] || N/A || N/A<br />
|-<br />
| [[Lusch Motors]] (all others) || [https://luschmotors.weebly.com/ See here] || N/A || N/A<br />
|-<br />
| [[SZYM Entourage]] 6 || [https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Entourage%20v6%20Exterior%20Template.psd PSD] || [https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Entourage%20v6%20Normal%20Template.tga TGA] || [https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Entourage%20v6%20Specular%20Template.tga TGA]<br />
|-<br />
| [[SZYM Entourage]] (sculpted) || [https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIliverydecaltemplate.psd Livery Decal PSD] [https://wiki.ntbigroup.com/images/4/49/NTBIliverydecaltemplatePNG.png PNG] || N/A || N/A<br />
|-<br />
| [[SZYM Intruder]] 6 || [https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Intruder%20v6%20Exterior%20Template.psd PSD] || [https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Intruder%20v6%20Normal%20Template.tga TGA] || [https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Intruder%20v6%20Specular%20Template.tga TGA]<br />
|-<br />
| [[SZYM Intruder]] (sculpted) || [https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIliverydecaltemplate.psd Livery Decal PSD] [https://wiki.ntbigroup.com/images/4/49/NTBIliverydecaltemplatePNG.png PNG] || N/A || N/A<br />
|-<br />
| [[SZYM Paladin]] 7 || [https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Paladin%207%20Cab%20Diffuse%20Template.psd Cab PSD]<br>[https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Paladin%207%20Bed%20Diffuse%20Template.psd Bed PSD]<br>[https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Paladin%207%20Mudflaps%20Diffuse%20Template.psd Mudflaps PSD (XL-C/XXL-C Only)] || N/A || [https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Paladin%207%20Specular%20Template.psd PSD]<br />
|-<br />
| [[SZYM Tahari]] || [https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIliverydecaltemplate.psd Livery Decal PSD] [https://wiki.ntbigroup.com/images/4/49/NTBIliverydecaltemplatePNG.png PNG] || N/A || N/A<br />
|-<br />
| [[TR-50 Fire Helmet|Tredpro TR-50 Fire Helmet]] || [https://ntbigroup.com/TEMPLATES/platetextureexample.psd Front Plate PSD] [https://wiki.ntbigroup.com/images/0/07/Helmetplateexample.png PNG] || N/A || N/A<br />
|}<br />
<br />
For products not in this list, please refer to the owner's manual for template links.</div>NelsonJenkinshttps://wiki.ntbigroup.com/index.php?title=Global_Mod_Link_System&diff=2960Global Mod Link System2021-04-26T01:06:59Z<p>NelsonJenkins: </p>
<hr />
<div>The '''Global Mod Link System (GMLS)''' is a free, full-permission script system provided by the NTBI Group. Anyone can implement GMLS into their modifiable vehicle, and anyone can build mods that automatically position themselves when linked to a GMLS-compatible vehicle.<br />
<br />
==Overview==<br />
GMLS is a set of full-permissions scripts. It is intended for use in modifiable vehicles to simplify the installation of prebuilt modifications. For example, the NTBI Factory Lightbar Package uses GMLS to automatically position lightbars when linked to compatible vehicles.<br />
<br />
Aftermarket modification manufacturers can set up GMLS by linking a copy of the modification to the desired vehicle and using the Calibration Tool to set up the Alignment Tool. Then, when an end-user links the modification to a compatible vehicle, the modification will reposition itself (and, if necessary, rescale itself) automatically. GMLS can also unlink certain prims from the vehicle for factory prim replacements.<br />
<br />
GMLS comes with three scripts:<br />
<br />
* '''NTBI GMLS Alignment Tool''' - Inserted into aftermarket modifications and edited by the modification manufacturer to program alignment positions and other options.<br />
* '''NTBI GMLS Calibration Tool''' - Used to calibrate alignment positions; outputs alignment data to be placed in the Alignment Tool.<br />
* '''NTBI GMLS Vehicle Sample Script''' - Inserted into vehicles and edited by the vehicle manufacturer to define vehicle information for use by modifications.<br />
<br />
The NTBI Group does not maintain a list of compatible vehicles or modifications. GMLS-compatible products should clearly label themselves as such. The NTBI Group does not provide any warranty for third-party GMLS implementations.<br />
<br />
<big>[https://marketplace.secondlife.com/p/GMLS-Development-Kit-Tools-for-Integrating-the-Global-Mod-Link-System/20803262 '''Click here''' for the GMLS developer kit.]</big><br />
<br />
==End-User Instructions==<br />
Refer to your vehicle's owner's guide for instructions on how to install GMLS-compatible equipment.<br />
<br />
If the owner's guide does not provide instructions, the following is a general checklist for installing GMLS-compatible modifications:<br />
<br />
# Ensure that the vehicle is turned off, including any lighting or other components that may change any attributes while installing the modification.<br />
# Take a copy of your vehicle as-is. Modifications may cause damage or unlink prims accidentally. Save a copy now in case this happens!<br />
# Rez the modification near your vehicle.<br />
# Right click the modification and select "Edit".<br />
# With the Edit window open, hold your SHIFT key and left click the vehicle. This should select both objects at once. Make sure you select the vehicle last.<br />
# Press your CTRL + L keys, or click the "Link" button in the Edit window.<br />
# If prompted, confirm that you want to link the two objects together.<br />
# When linked, the modification should automatically position itself to the recommended position and resize if necessary.<br />
# If prompted, grant link permissions. This may unlink some prims. Make sure to delete them after.<br />
# If desired, you may usually move the equipment once linked.<br />
<br />
If a modification does not use GMLS, is not compatible with your vehicle's GMLS system, or returns an error when linking using the above procedure, follow steps 1 through 6, then manually reposition the modification as needed.<br />
<br />
==Aftermarket Modification Manufacturer Instructions==<br />
Get the Alignment Tool and Calibration Tool from the [https://marketplace.secondlife.com/p/GMLS-Development-Kit-Tools-for-Integrating-the-Global-Mod-Link-System/20803262 GMLS developer kit.]<br />
<br />
Before continuing, make sure your mod is finished. Do not continue until you are sure you do not need to make any changes to your object.<br />
<br />
# Make a two copies of your object. One will be used for calibration. The other will be distributed to your end-users.<br />
# Place the "NTBI GMLS Alignment Tool" script in the distribution object (the one you will keep).<br />
# Place the "NTBI GMLS Calibration Tool" script in the calibration object (the one you will link, then delete).<br />
<br />
For each vehicle you want your object to be compatible with:<br />
<br />
# Make a new copy of the calibration object. It should have the "NTBI GMLS Calibration Tool" script already in it.<br />
# Rez the vehicle. Make sure it is the original size!<br />
# Position the calibration object on the vehicle, exactly where you want it to be once installed by the end-user.<br />
# Link the calibration object to the vehicle.<br />
# Copy the script snippet line sent to local chat.<br />
# Open the "NTBI GMLS Alignment Tool" script in the distribution object.<br />
# Paste the script snippet line between the two marked lines at the top of the script. NOTE: The first part of each line is the GMLS ID of the vehicle you have calibrated to. If you see a line with the same GMLS ID, you have already calibrated to that vehicle, and only the first instance of that vehicle will be used.<br />
# Save the "NTBI GMLS Alignment Tool" script.<br />
<br />
Once finished, delete any calibration objects and vehicles.<br />
<br />
If you want the root prim of the object to retain its physics type when linked to the vehicle, change root_no_physics to FALSE. (By default, the root prim of this object will be set to physics type "none" and the physics types of child prims will remain the same.)<br />
<br />
If you want to have the GMLS script automatically unlink prims, list their names in the remove_prims list. If you do this, you can also change remove_move_dist to change the distance unlinked prims will move up, and you can change remove_recolor to FALSE if you do not want unlinked prims to be recolored bright red for visibility.<br />
<br />
If you do not want the object to be set to temporary when unlinking prims in the remove_prims list so that they automatically delete themselves, change make_temp to FALSE.<br />
<br />
When finished, make sure you test your modification on each compatible vehicle to make sure it works correctly.<br />
<br />
===API===<br />
The Alignment Tool and vehicle script send the following link messages that can be used to trigger additional scripts in your modification:<br />
<br />
* <code>GMLS_REQUEST</code><br />
** Sent by Alignment Tool once linked. Vehicle responds with <code>GMLS_ID</code> if compatible. You can also send this manually once the GMLS script is finished if you need any information from <code>GMLS_ID</code>.<br />
* <code>GMLS_ID</code><br />
** '''Key''': [gmls_id]|[root scale]|[additional information]<br />
** Sent by vehicle in response to <code>GMLS_REQUEST</code>. Note that [root scale] is not the ''size'' of the root prim of the vehicle, but rather the ratio of the current size of the root to the original size of the root. For example, [root scale] on a vehicle that was upsized to twice its original size would be <2.0, 2.0, 2.0> regardless of its actual size.<br />
* <code>GMLS_SUCCESS</code><br />
** Sent by Alignment Tool if the GMLS operation completed successfully and it is now safe to perform any configuration changes or whatever else on the newly linked-to vehicle.<br />
* <code>GMLS_FAIL</code><br />
** Sent by Alignment Tool if the GMLS operation failed either because the object the modification was just linked to is not GMLS-compatible or the vehicle has a gmls_id that the modification was not calibrated for.<br />
* <code>GMLS_CANCEL</code><br />
** Sent by Alignment Tool if the GMLS operation was cancelled by the user.<br />
<br />
==Vehicle Manufacturer Instructions==<br />
Get the Alignment Tool and Calibration Tool from the [https://marketplace.secondlife.com/p/GMLS-Development-Kit-Tools-for-Integrating-the-Global-Mod-Link-System/20803262 GMLS developer kit.]<br />
<br />
Before continuing, make sure your vehicle's root prim will not be resized before it is distributed. Do not continue until the root prim is finalized.<br />
<br />
# Place the "NTBI GMLS Vehicle Sample Script" script in the vehicle. If you prefer, you can also integrate this script into another script in the vehicle to save memory.<br />
# Edit the gmls_id string. You can use any string as long as it does not include the pipe ("|") character, but it should be limited to alphanumeric characters, underscores ("_"), and be up to 32 characters. The gmls_id must be unique for every vehicle that has a different layout of potential modification positions. For example, use different IDs for 2DR and 4DR variations of the same vehicle.<br />
# Edit the gmls_default_root_size vector to be the size of the root prim of the vehicle. On most viewers, you can get this value by opening the Edit window, going to the Object tab, and pushing the "C" button next to Size. WARNING: This is not optional. Failure to set this value will cause GMLS modifications to align improperly.<br />
# Save the "NTBI GMLS Vehicle Sample Script" script. If kept separate, you can [http://wiki.secondlife.com/wiki/LlSetMemoryLimit limit the memory used by the script] if you prefer.<br />
<br />
Perform this procedure for each vehicle variation. Once finished, it is a good idea to test the GMLS settings by creating a simple object and following the Aftermarket Modification Manufacturer Instructions.<br />
<br />
==Changelog==<br />
Rev. 3<br />
* Fixed child prims not being aligned if linked immediately after script reset (either manually or due to object copying).<br />
Rev. 2<br />
* Added make_temp option.<br />
* Changed unlinking parts procedure so that unlinked prims are set to temporary if make_temp is enabled.<br />
Rev. 1<br />
* Added GMLS_SUCCESS, GMLS_FAIL, and GMLS_CANCEL link messages.<br />
* Fixed erroring out and refusing to reposition if linked before permissions have been granted.<br />
* Fixed unlinking parts check running before checking if vehicle is compatible in the first place.<br />
* Fixed crosstalk when multiple GMLS modifications are rezzed at once.<br />
* Improved vehicle detection in slow regions by extending identification time from 2 seconds to 5 seconds.<br />
Rev. 0<br />
* Initial public release.</div>NelsonJenkinshttps://wiki.ntbigroup.com/index.php?title=Global_Vehicle_HUD&diff=2959Global Vehicle HUD2021-04-21T02:54:20Z<p>NelsonJenkins: /* Changelog */</p>
<hr />
<div>The '''Global Vehicle HUD (GVHUD)''' is a free, open-use HUD provided by the NTBI Group. Anyone can implement GVHUD compatibility into their vehicle and the GVHUD is available for free.<br />
<br />
==Overview==<br />
The GVHUD is a dynamically customizable HUD intended for use by vehicle manufacturers. Manufacturers can use the GVHUD to control different aspects of the vehicle without designing their own HUD.<br />
<br />
The NTBI Group does not maintain a list of compatible vehicles. GVHUD-compatible products should clearly label themselves as such. The NTBI Group does not provide any warranty or support for third-party GVHUD implementations.<br />
<br />
<big>[https://marketplace.secondlife.com/p/Global-Vehicle-HUD-Latest-Version-for-GVHUD-Compatible-Vehicles/20803267 '''Click here''' for the latest version of the GVHUD.]</big><br />
<br />
==End-User Instructions==<br />
Wear the GVHUD by right clicking it in your inventory and selecting "Wear" or "Add". You can also attach it to a different HUD slot (default Top), but you will likely need to reposition it manually.<br />
<br />
You can position the GVHUD as desired in both hidden and shown mode. When hidden or shown, the GVHUD will reposition itself to the position it was last placed in while in that mode.<br />
<br />
The GVHUD layout includes three main sections - a set of per-vehicle customizable buttons, an LCD display with soft buttons, and HIDE and GSTR buttons, which hide the GVHUD and send a folder with gesture keybinds, respectively. The customizable buttons and LCD display layout is different for each vehicle; refer to your vehicle's owner's guide for details.<br />
<br />
==Vehicle Manufacturer Instructions==<br />
Vehicle manufacturers must implement the following API on their own; no support is provided.<br />
<br />
All communication with the GVHUD is done via channel <code>47504750</code>.<br />
<br />
The following commands can be sent from the vehicle to the GVHUD using llRegionSayTo to the avatar's UUID, or the HUD UUID if preferred:<br />
<br />
* '''SYN'''<br />
** Format: <code>SYN</code><br />
** Should be sent by the vehicle when the driver sits. Must only be sent to the driver's avatar UUID, otherwise crosstalk will occur. GVHUD will respond with '''CON'''.<br />
* '''ACK'''<br />
** Format: <code>ACK|[vehicle name]|[array of button ID numbers]|[array of button latch flags]|[array of button states]|[siren main prim UUID]|[siren reverb prim UUID]|[siren name]|[switch state]</code><br />
** Should be sent by the vehicle in response to '''CON'''. Vehicle should also send '''MNU''' immediately after, if desired.<br />
** [vehicle name] is the name of the vehicle to display on the LCD, up to 22 characters.<br />
** [array of button ID numbers] is a comma-separated list of button ID numbers from the table below. The array must be exactly 30 buttons, ordered from 8 left to right at the top (excluding buttons above the LCD), 8 left to right in the center, 8 left to right on the bottom, then 6 left to right above the LCD.<br />
** [array of button latch flags] is a comma-separated list of button latch flags, either 0 for momentary or 1 for latched. The array must be exactly 30 buttons, organized the same as above.<br />
** [array of button states] is a comma-separated list of button states, either 0 for off or 1 for on. The array must be exactly 30 buttons, organized the same as above.<br />
** [siren main prim UUID] and [siren reverb prim UUID] are the prim UUIDs of the siren emitter prims. See below for details.<br />
** [siren name] is the name of the currently installed siren. Possible sirens are: GT6500, GT20A, VR900, BF200, UG4000, SP700, GT4500, MP224, eM, PC9, MP224E, EURO1<br />
** [switch state] is the state of the four-position switch, either 0, 1, 2, or 3.<br />
* '''MNU'''<br />
** Format: <code>MNU|[JSON menu data]</code><br />
** Should be sent by the vehicle immediately after '''ACK''' and can be sent whenever the vehicle wants to set up a new LCD soft button menu tree, if desired.<br />
** [JSON menu data] is a JSON array of menu items, which are JSON objects. Each menu item has the following attributes:<br />
*** "l": label to display for menu item, a string of up to 8 characters, wrapped onto 2 lines of 4 characters each. To skip a menu item on the display, use an empty label ("").<br />
*** "sub" (optional): a JSON array of menu items. If specified, opens a new menu when this menu item is selected.<br />
*** "act" (optional): an action to perform when this menu item is selected. Can be one of the following:<br />
**** "back": Moves back to the previous menu, if a submenu.<br />
**** "help": Opens GVHUD help URL.<br />
** To close the menu, send a blank string ("") for [JSON menu data].<br />
* '''TXT'''<br />
** Format: <code>TXT|[row number]|[text]</code><br />
** Can be sent by the vehicle to render text on the LCD. The GVHUD must have sent '''RFR''' first to signal that the display is ready, otherwise commands will be dropped.<br />
** [row number] is the row number, from 0 to 3, to render text on. If a menu is currently active, using row numbers 2 or 3 will close the menu.<br />
** [text] is the text to render, up to 24 characters.<br />
* '''MSG'''<br />
** Format: <code>MSG|[text]</code><br />
** Can be sent by the vehicle to send a chat message to the HUD wearer.<br />
* '''PSN'''<br />
** Format: <code>PSN|[sound UUID]|[sound volume]</code><br />
** Can be sent by the vehicle to play a sound UUID for the HUD wearer only.<br />
* '''UPD'''<br />
** Format: <code>UPD|[button index]|[button ID]|[state]</code><br />
** Can be sent by the vehicle to update a button state on the GVHUD. Note that no processing will be performed for this button, so '''BTN''' will not be sent.<br />
** [button index] is the index of the button in the button arrays, 0 to 29. Alternatively, [button index] can be set to -1 to use [button ID] instead.<br />
** [button ID] is the button ID from the table below. Can be used if the vehicle would prefer handling commands via the button ID instead of the button index, but is very slightly slower. If [button index] is not -1, [button ID] is ignored.<br />
** [state] is 0 for off or 1 for on.<br />
* '''SIS'''<br />
** Format: <code>SIS|[siren name]</code><br />
** Can be sent by the vehicle to install a siren outside of '''ACK'''.<br />
** [siren name] is the name of the newly installed siren; see '''ACK''' for a list of possible sirens.<br />
* '''SSS'''<br />
** Format: <code>SSS|[siren state]</code><br />
** Should be sent by the vehicle if another GVHUD sends '''SST''', or if the vehicle has activated a park kill feature.<br />
** [siren state] should be the [siren state] string provided by '''SST'''. [siren state] can also be "off" (without quotes) if the vehicle has a park kill feature.<br />
* '''SSF'''<br />
** Format: <code>SSF|[siren state]</code><br />
** Can be sent by the vehicle to play a siren tone ("off", "t1", "t2", "t3", "manual", or "horn"). Acts the same as '''SSS''', except the GVHUD will send the siren sounds to the siren sound emitter prims, so can be used to force a siren sound.<br />
* '''SVU'''<br />
** Format: <code>SWU|[switch state]</code><br />
** Should be sent by the vehicle if another GVHUD sends '''SWS'''.<br />
** [switch state] should be the [switch state] integer provided by '''SWS'''.<br />
* '''DIS'''<br />
** Format: <code>DIS</code><br />
** Should be sent by the vehicle when the driver unsits.<br />
<br />
The following commands will be sent by the GVHUD to the vehicle using llRegionSayTo to the prim UUID of the object that sent '''ACK''' unless otherwise specified:<br />
<br />
* '''OPT'''<br />
** Format: <code>OPT|[menu label]</code><br />
** Sent by the GVHUD when a menu item is selected. Sent on every selection, including when switching to a submenu.<br />
** [menu label] is the label of the selected menu item.<br />
* '''RFR'''<br />
** Format: <code>RFR</code><br />
** Sent by the GVHUD when it is ready to accept '''TXT''' commands. Vehicle should start sending '''TXT''' commands once it receives '''RFR''' after '''CON'''.<br />
* '''BTN'''<br />
** Format: <code>BTN|[button index]|[button ID]|[state]</code><br />
** Sent by the GVHUD when a button is pressed or released.<br />
** [button index] is the index of the button in the button arrays, 0 to 29.<br />
** [button ID] is the button ID from the table below.<br />
** [state] is 0 for off or 1 for on.<br />
* '''GST'''<br />
** Format: <code>GST|[command]</code><br />
** Sent by the GVHUD when a gesture hotkey is used.<br />
** [command] can be one of the commands described in Gesture Controls below.<br />
* '''SRN'''<br />
** Format: <code>SRN|[sound UUID]</code><br />
** Sent by the GVHUD ''directly to the siren emitter prim specified by '''ACK''' only'' to cause it to play a siren sound.<br />
** [sound UUID] is a sound to play, or NULL_KEY to stop sounds.<br />
* '''SST'''<br />
** Format: <code>SST|[siren state]</code><br />
** Sent by the GVHUD when the siren mode changed. If multiple GVHUDs are attached, the vehicle should send '''SSS''' to the other GVHUD.<br />
** [siren state] is the state of the siren.<br />
* '''SWS'''<br />
** Format: <code>SWS|[switch state]</code><br />
** Sent by the GVHUD when the switch is moved. If multiple GVHUDs are attached, the vehicle should send '''SWU''' to the other GVHUD.<br />
* '''CON'''<br />
** Format: <code>CON</code><br />
** Sent by the GVHUD when it is attached/reset, or in response to '''SYN'''.<br />
<br />
===Siren Interface===<br />
If a siren is used, two prims must be designated as siren sound emitter prims. Their UUIDs should be detected and sent in '''ACK'''.<br />
<br />
To reduce latency, the GVHUD sends '''SRN''' commands directly to the prims designated by '''ACK'''. Each prim must listen for '''SRN''' independently of the script that handles other GVHUD communication, and should play siren sounds as sent by the GVHUD. A sample script is below, which should be placed in each of the prims designated as siren emitter prims:<br />
<br />
default<br />
{<br />
state_entry()<br />
{<br />
llListen(47504750, "", "", "");<br />
}<br />
listen(integer channel, string name, key id, string message)<br />
{<br />
if (llGetSubString(message, 0, 3) == "SRN|" && id == hud_uuid)<br />
{<br />
string uuid = llGetSubString(message, 4, -1);<br />
if (uuid == NULL_KEY) llStopSound();<br />
else llLoopSound(uuid, 1.0);<br />
}<br />
}<br />
}<br />
<br />
Sound emitter scripts must verify that the object that sent the '''SRN''' command is the connected GVHUD. This script snippet does not define <code>hud_uuid</code>; it must be set when the script that controls GVHUD communication sends '''ACK''' so that the emitter knows the UUID of the connected GVHUD.<br />
<br />
===Gesture Controls===<br />
The gestures provided in the GVHUD send the following internal commands:<br />
<br />
* '''F2''': "ZF2", resizes GVHUD.<br />
* '''F3''': "ZF3", toggles axle lock (button ID 28), if equipped, otherwise ignored.<br />
* '''F4''': "ZF4", cycles through hands-free siren tones, if eqipped, otherwise ignored.<br />
* '''F5''': "ZF5", moves switch to position 0.<br />
* '''F6''': "ZF6", moves switch to position 1.<br />
* '''F7''': "ZF7", moves switch to position 2.<br />
* '''F8''': "ZF8", moves switch to position 3.<br />
* '''Ctrl + Left''': "ZCA", toggles turn L (button ID 24), if equipped, otherwise ignored.<br />
* '''Ctrl + Right''': "ZCD", toggles turn L (button ID 29), if equipped, otherwise ignored.<br />
* '''Ctrl + Down''': "ZCS", toggles hazards (button ID 25), if equipped, otherwise ignored.<br />
* '''H''': "ZZH", horn tap, sends <code>GST|HORN</code>.<br />
* '''L''': "ZZL", toggles cycle headlights (button ID 26), if equipped, otherwise ignored.<br />
* '''K''': "ZZK", high beams flash, sends <code>GST|BRIGHT</code>.<br />
* '''I''': "ZZI", toggles key (button ID 7), if equipped, otherwise ignored.<br />
* '''O''': "ZZO", get out, sends <code>GST|OUT</code>.<br />
* '''Space''': "ZZ_", handbrake, sends <code>GST|BRAKE</code>.<br />
* '''1''': "ZZ1", camera 1, sends <code>GST|CAM1</code>.<br />
* '''2''': "ZZ2", camera 2, sends <code>GST|CAM2</code>.<br />
* '''3''': "ZZ3", camera 3, sends <code>GST|CAM3</code>.<br />
* '''4''': "ZZ4", camera 4, sends <code>GST|CAM4</code>.<br />
* '''5''': "ZZ5", camera 5, sends <code>GST|CAM5</code>.<br />
* '''6''': "ZZ6", camera 6, sends <code>GST|CAM6</code>.<br />
<br />
===Button IDs===<br />
The following is a list of available button IDs.<br />
<br />
This list can be expanded by the NTBI Group without a GVHUD update. If you have a button label you would like to be integrated into the GVHUD's available buttons, contact Nelson Jenkins.<br />
<br />
{| class="wikitable"<br />
|-<br />
! ID || Description || ID || Description || ID || Description || ID || Description<br />
|-<br />
| -10 || Siren Wail* || -11 || Siren Yelp* || -12 || Siren Priority* || -13 || Siren Manual*<br />
|-<br />
| -14 || Siren Horn* || -1 || Blank || || || || <br />
|-<br />
| 0 || LIGHT BAR (Red) || 1 || STRB (Red) || 2 || TKDN FLASH (Red) || 3 || TAKE DOWN (Red)<br />
|-<br />
| 4 || FLOOD (Red) || 5 || CRZ (Red) || 6 || (Reserved) || 7 || Key (Green)<br />
|-<br />
| 8 || HIDE AWAY (Red) || 9 || WIG WAG (Red) || 10 || Arrow (Red) || 11 || Siren Wail*<br />
|-<br />
| 12 || Siren Yelp* || 13 || Siren Priority* || 14 || Siren Manual* || 15 || Siren Horn*<br />
|-<br />
| 16 || AUX 1 || 17 || AUX 2 || 18 || AUX 3 || 19 || CUT F (Red)<br />
|-<br />
| 20 || CUT R (Red) || 21 || (Reserved) || 22 || (Reserved) || 23 || (Reserved)<br />
|-<br />
| 24 || Turn Sig L || 25 || Cycle Headlights || 26 || Hazard Flashers || 27 || Horn<br />
|-<br />
| 28 || Axle Lock || 29 || Turn Sig R || || || || <br />
|}<br />
<br />
<nowiki>*</nowiki> Use negative button IDs for GVHUD to handle the siren. The GVHUD will automatically pick the correct buttons to show, will only allow one on at a time, and will send siren commands directly to the prims specified in SSU. Use positive button IDs for sirens only if you want them to send BTN commands and not be connected together.<br />
<br />
==Changelog==<br />
Rev. 2<br />
* Added PSN command.<br />
* Added SSF command.<br />
Rev. 1<br />
* Fixed GVHUD gestures not working.<br />
* Fixed GVHUD losing its saved position/scale data and resetting when attached.<br />
Rev. 0<br />
* Initial public release.</div>NelsonJenkinshttps://wiki.ntbigroup.com/index.php?title=Global_Vehicle_HUD&diff=2958Global Vehicle HUD2021-04-21T02:53:55Z<p>NelsonJenkins: </p>
<hr />
<div>The '''Global Vehicle HUD (GVHUD)''' is a free, open-use HUD provided by the NTBI Group. Anyone can implement GVHUD compatibility into their vehicle and the GVHUD is available for free.<br />
<br />
==Overview==<br />
The GVHUD is a dynamically customizable HUD intended for use by vehicle manufacturers. Manufacturers can use the GVHUD to control different aspects of the vehicle without designing their own HUD.<br />
<br />
The NTBI Group does not maintain a list of compatible vehicles. GVHUD-compatible products should clearly label themselves as such. The NTBI Group does not provide any warranty or support for third-party GVHUD implementations.<br />
<br />
<big>[https://marketplace.secondlife.com/p/Global-Vehicle-HUD-Latest-Version-for-GVHUD-Compatible-Vehicles/20803267 '''Click here''' for the latest version of the GVHUD.]</big><br />
<br />
==End-User Instructions==<br />
Wear the GVHUD by right clicking it in your inventory and selecting "Wear" or "Add". You can also attach it to a different HUD slot (default Top), but you will likely need to reposition it manually.<br />
<br />
You can position the GVHUD as desired in both hidden and shown mode. When hidden or shown, the GVHUD will reposition itself to the position it was last placed in while in that mode.<br />
<br />
The GVHUD layout includes three main sections - a set of per-vehicle customizable buttons, an LCD display with soft buttons, and HIDE and GSTR buttons, which hide the GVHUD and send a folder with gesture keybinds, respectively. The customizable buttons and LCD display layout is different for each vehicle; refer to your vehicle's owner's guide for details.<br />
<br />
==Vehicle Manufacturer Instructions==<br />
Vehicle manufacturers must implement the following API on their own; no support is provided.<br />
<br />
All communication with the GVHUD is done via channel <code>47504750</code>.<br />
<br />
The following commands can be sent from the vehicle to the GVHUD using llRegionSayTo to the avatar's UUID, or the HUD UUID if preferred:<br />
<br />
* '''SYN'''<br />
** Format: <code>SYN</code><br />
** Should be sent by the vehicle when the driver sits. Must only be sent to the driver's avatar UUID, otherwise crosstalk will occur. GVHUD will respond with '''CON'''.<br />
* '''ACK'''<br />
** Format: <code>ACK|[vehicle name]|[array of button ID numbers]|[array of button latch flags]|[array of button states]|[siren main prim UUID]|[siren reverb prim UUID]|[siren name]|[switch state]</code><br />
** Should be sent by the vehicle in response to '''CON'''. Vehicle should also send '''MNU''' immediately after, if desired.<br />
** [vehicle name] is the name of the vehicle to display on the LCD, up to 22 characters.<br />
** [array of button ID numbers] is a comma-separated list of button ID numbers from the table below. The array must be exactly 30 buttons, ordered from 8 left to right at the top (excluding buttons above the LCD), 8 left to right in the center, 8 left to right on the bottom, then 6 left to right above the LCD.<br />
** [array of button latch flags] is a comma-separated list of button latch flags, either 0 for momentary or 1 for latched. The array must be exactly 30 buttons, organized the same as above.<br />
** [array of button states] is a comma-separated list of button states, either 0 for off or 1 for on. The array must be exactly 30 buttons, organized the same as above.<br />
** [siren main prim UUID] and [siren reverb prim UUID] are the prim UUIDs of the siren emitter prims. See below for details.<br />
** [siren name] is the name of the currently installed siren. Possible sirens are: GT6500, GT20A, VR900, BF200, UG4000, SP700, GT4500, MP224, eM, PC9, MP224E, EURO1<br />
** [switch state] is the state of the four-position switch, either 0, 1, 2, or 3.<br />
* '''MNU'''<br />
** Format: <code>MNU|[JSON menu data]</code><br />
** Should be sent by the vehicle immediately after '''ACK''' and can be sent whenever the vehicle wants to set up a new LCD soft button menu tree, if desired.<br />
** [JSON menu data] is a JSON array of menu items, which are JSON objects. Each menu item has the following attributes:<br />
*** "l": label to display for menu item, a string of up to 8 characters, wrapped onto 2 lines of 4 characters each. To skip a menu item on the display, use an empty label ("").<br />
*** "sub" (optional): a JSON array of menu items. If specified, opens a new menu when this menu item is selected.<br />
*** "act" (optional): an action to perform when this menu item is selected. Can be one of the following:<br />
**** "back": Moves back to the previous menu, if a submenu.<br />
**** "help": Opens GVHUD help URL.<br />
** To close the menu, send a blank string ("") for [JSON menu data].<br />
* '''TXT'''<br />
** Format: <code>TXT|[row number]|[text]</code><br />
** Can be sent by the vehicle to render text on the LCD. The GVHUD must have sent '''RFR''' first to signal that the display is ready, otherwise commands will be dropped.<br />
** [row number] is the row number, from 0 to 3, to render text on. If a menu is currently active, using row numbers 2 or 3 will close the menu.<br />
** [text] is the text to render, up to 24 characters.<br />
* '''MSG'''<br />
** Format: <code>MSG|[text]</code><br />
** Can be sent by the vehicle to send a chat message to the HUD wearer.<br />
* '''PSN'''<br />
** Format: <code>PSN|[sound UUID]|[sound volume]</code><br />
** Can be sent by the vehicle to play a sound UUID for the HUD wearer only.<br />
* '''UPD'''<br />
** Format: <code>UPD|[button index]|[button ID]|[state]</code><br />
** Can be sent by the vehicle to update a button state on the GVHUD. Note that no processing will be performed for this button, so '''BTN''' will not be sent.<br />
** [button index] is the index of the button in the button arrays, 0 to 29. Alternatively, [button index] can be set to -1 to use [button ID] instead.<br />
** [button ID] is the button ID from the table below. Can be used if the vehicle would prefer handling commands via the button ID instead of the button index, but is very slightly slower. If [button index] is not -1, [button ID] is ignored.<br />
** [state] is 0 for off or 1 for on.<br />
* '''SIS'''<br />
** Format: <code>SIS|[siren name]</code><br />
** Can be sent by the vehicle to install a siren outside of '''ACK'''.<br />
** [siren name] is the name of the newly installed siren; see '''ACK''' for a list of possible sirens.<br />
* '''SSS'''<br />
** Format: <code>SSS|[siren state]</code><br />
** Should be sent by the vehicle if another GVHUD sends '''SST''', or if the vehicle has activated a park kill feature.<br />
** [siren state] should be the [siren state] string provided by '''SST'''. [siren state] can also be "off" (without quotes) if the vehicle has a park kill feature.<br />
* '''SSF'''<br />
** Format: <code>SSF|[siren state]</code><br />
** Can be sent by the vehicle to play a siren tone ("off", "t1", "t2", "t3", "manual", or "horn"). Acts the same as '''SSS''', except the GVHUD will send the siren sounds to the siren sound emitter prims, so can be used to force a siren sound.<br />
* '''SVU'''<br />
** Format: <code>SWU|[switch state]</code><br />
** Should be sent by the vehicle if another GVHUD sends '''SWS'''.<br />
** [switch state] should be the [switch state] integer provided by '''SWS'''.<br />
* '''DIS'''<br />
** Format: <code>DIS</code><br />
** Should be sent by the vehicle when the driver unsits.<br />
<br />
The following commands will be sent by the GVHUD to the vehicle using llRegionSayTo to the prim UUID of the object that sent '''ACK''' unless otherwise specified:<br />
<br />
* '''OPT'''<br />
** Format: <code>OPT|[menu label]</code><br />
** Sent by the GVHUD when a menu item is selected. Sent on every selection, including when switching to a submenu.<br />
** [menu label] is the label of the selected menu item.<br />
* '''RFR'''<br />
** Format: <code>RFR</code><br />
** Sent by the GVHUD when it is ready to accept '''TXT''' commands. Vehicle should start sending '''TXT''' commands once it receives '''RFR''' after '''CON'''.<br />
* '''BTN'''<br />
** Format: <code>BTN|[button index]|[button ID]|[state]</code><br />
** Sent by the GVHUD when a button is pressed or released.<br />
** [button index] is the index of the button in the button arrays, 0 to 29.<br />
** [button ID] is the button ID from the table below.<br />
** [state] is 0 for off or 1 for on.<br />
* '''GST'''<br />
** Format: <code>GST|[command]</code><br />
** Sent by the GVHUD when a gesture hotkey is used.<br />
** [command] can be one of the commands described in Gesture Controls below.<br />
* '''SRN'''<br />
** Format: <code>SRN|[sound UUID]</code><br />
** Sent by the GVHUD ''directly to the siren emitter prim specified by '''ACK''' only'' to cause it to play a siren sound.<br />
** [sound UUID] is a sound to play, or NULL_KEY to stop sounds.<br />
* '''SST'''<br />
** Format: <code>SST|[siren state]</code><br />
** Sent by the GVHUD when the siren mode changed. If multiple GVHUDs are attached, the vehicle should send '''SSS''' to the other GVHUD.<br />
** [siren state] is the state of the siren.<br />
* '''SWS'''<br />
** Format: <code>SWS|[switch state]</code><br />
** Sent by the GVHUD when the switch is moved. If multiple GVHUDs are attached, the vehicle should send '''SWU''' to the other GVHUD.<br />
* '''CON'''<br />
** Format: <code>CON</code><br />
** Sent by the GVHUD when it is attached/reset, or in response to '''SYN'''.<br />
<br />
===Siren Interface===<br />
If a siren is used, two prims must be designated as siren sound emitter prims. Their UUIDs should be detected and sent in '''ACK'''.<br />
<br />
To reduce latency, the GVHUD sends '''SRN''' commands directly to the prims designated by '''ACK'''. Each prim must listen for '''SRN''' independently of the script that handles other GVHUD communication, and should play siren sounds as sent by the GVHUD. A sample script is below, which should be placed in each of the prims designated as siren emitter prims:<br />
<br />
default<br />
{<br />
state_entry()<br />
{<br />
llListen(47504750, "", "", "");<br />
}<br />
listen(integer channel, string name, key id, string message)<br />
{<br />
if (llGetSubString(message, 0, 3) == "SRN|" && id == hud_uuid)<br />
{<br />
string uuid = llGetSubString(message, 4, -1);<br />
if (uuid == NULL_KEY) llStopSound();<br />
else llLoopSound(uuid, 1.0);<br />
}<br />
}<br />
}<br />
<br />
Sound emitter scripts must verify that the object that sent the '''SRN''' command is the connected GVHUD. This script snippet does not define <code>hud_uuid</code>; it must be set when the script that controls GVHUD communication sends '''ACK''' so that the emitter knows the UUID of the connected GVHUD.<br />
<br />
===Gesture Controls===<br />
The gestures provided in the GVHUD send the following internal commands:<br />
<br />
* '''F2''': "ZF2", resizes GVHUD.<br />
* '''F3''': "ZF3", toggles axle lock (button ID 28), if equipped, otherwise ignored.<br />
* '''F4''': "ZF4", cycles through hands-free siren tones, if eqipped, otherwise ignored.<br />
* '''F5''': "ZF5", moves switch to position 0.<br />
* '''F6''': "ZF6", moves switch to position 1.<br />
* '''F7''': "ZF7", moves switch to position 2.<br />
* '''F8''': "ZF8", moves switch to position 3.<br />
* '''Ctrl + Left''': "ZCA", toggles turn L (button ID 24), if equipped, otherwise ignored.<br />
* '''Ctrl + Right''': "ZCD", toggles turn L (button ID 29), if equipped, otherwise ignored.<br />
* '''Ctrl + Down''': "ZCS", toggles hazards (button ID 25), if equipped, otherwise ignored.<br />
* '''H''': "ZZH", horn tap, sends <code>GST|HORN</code>.<br />
* '''L''': "ZZL", toggles cycle headlights (button ID 26), if equipped, otherwise ignored.<br />
* '''K''': "ZZK", high beams flash, sends <code>GST|BRIGHT</code>.<br />
* '''I''': "ZZI", toggles key (button ID 7), if equipped, otherwise ignored.<br />
* '''O''': "ZZO", get out, sends <code>GST|OUT</code>.<br />
* '''Space''': "ZZ_", handbrake, sends <code>GST|BRAKE</code>.<br />
* '''1''': "ZZ1", camera 1, sends <code>GST|CAM1</code>.<br />
* '''2''': "ZZ2", camera 2, sends <code>GST|CAM2</code>.<br />
* '''3''': "ZZ3", camera 3, sends <code>GST|CAM3</code>.<br />
* '''4''': "ZZ4", camera 4, sends <code>GST|CAM4</code>.<br />
* '''5''': "ZZ5", camera 5, sends <code>GST|CAM5</code>.<br />
* '''6''': "ZZ6", camera 6, sends <code>GST|CAM6</code>.<br />
<br />
===Button IDs===<br />
The following is a list of available button IDs.<br />
<br />
This list can be expanded by the NTBI Group without a GVHUD update. If you have a button label you would like to be integrated into the GVHUD's available buttons, contact Nelson Jenkins.<br />
<br />
{| class="wikitable"<br />
|-<br />
! ID || Description || ID || Description || ID || Description || ID || Description<br />
|-<br />
| -10 || Siren Wail* || -11 || Siren Yelp* || -12 || Siren Priority* || -13 || Siren Manual*<br />
|-<br />
| -14 || Siren Horn* || -1 || Blank || || || || <br />
|-<br />
| 0 || LIGHT BAR (Red) || 1 || STRB (Red) || 2 || TKDN FLASH (Red) || 3 || TAKE DOWN (Red)<br />
|-<br />
| 4 || FLOOD (Red) || 5 || CRZ (Red) || 6 || (Reserved) || 7 || Key (Green)<br />
|-<br />
| 8 || HIDE AWAY (Red) || 9 || WIG WAG (Red) || 10 || Arrow (Red) || 11 || Siren Wail*<br />
|-<br />
| 12 || Siren Yelp* || 13 || Siren Priority* || 14 || Siren Manual* || 15 || Siren Horn*<br />
|-<br />
| 16 || AUX 1 || 17 || AUX 2 || 18 || AUX 3 || 19 || CUT F (Red)<br />
|-<br />
| 20 || CUT R (Red) || 21 || (Reserved) || 22 || (Reserved) || 23 || (Reserved)<br />
|-<br />
| 24 || Turn Sig L || 25 || Cycle Headlights || 26 || Hazard Flashers || 27 || Horn<br />
|-<br />
| 28 || Axle Lock || 29 || Turn Sig R || || || || <br />
|}<br />
<br />
<nowiki>*</nowiki> Use negative button IDs for GVHUD to handle the siren. The GVHUD will automatically pick the correct buttons to show, will only allow one on at a time, and will send siren commands directly to the prims specified in SSU. Use positive button IDs for sirens only if you want them to send BTN commands and not be connected together.<br />
<br />
==Changelog==<br />
Rev. 1<br />
* Fixed GVHUD gestures not working.<br />
* Fixed GVHUD losing its saved position/scale data and resetting when attached.<br />
Rev. 0<br />
* Initial public release.</div>NelsonJenkinshttps://wiki.ntbigroup.com/index.php?title=Global_Mod_Link_System&diff=2957Global Mod Link System2021-04-21T02:50:30Z<p>NelsonJenkins: </p>
<hr />
<div>The '''Global Mod Link System (GMLS)''' is a free, full-permission script system provided by the NTBI Group. Anyone can implement GMLS into their modifiable vehicle, and anyone can build mods that automatically position themselves when linked to a GMLS-compatible vehicle.<br />
<br />
==Overview==<br />
GMLS is a set of full-permissions scripts. It is intended for use in modifiable vehicles to simplify the installation of prebuilt modifications. For example, the NTBI Factory Lightbar Package uses GMLS to automatically position lightbars when linked to compatible vehicles.<br />
<br />
Aftermarket modification manufacturers can set up GMLS by linking a copy of the modification to the desired vehicle and using the Calibration Tool to set up the Alignment Tool. Then, when an end-user links the modification to a compatible vehicle, the modification will reposition itself (and, if necessary, rescale itself) automatically. GMLS can also unlink certain prims from the vehicle for factory prim replacements.<br />
<br />
GMLS comes with three scripts:<br />
<br />
* '''NTBI GMLS Alignment Tool''' - Inserted into aftermarket modifications and edited by the modification manufacturer to program alignment positions and other options.<br />
* '''NTBI GMLS Calibration Tool''' - Used to calibrate alignment positions; outputs alignment data to be placed in the Alignment Tool.<br />
* '''NTBI GMLS Vehicle Sample Script''' - Inserted into vehicles and edited by the vehicle manufacturer to define vehicle information for use by modifications.<br />
<br />
The NTBI Group does not maintain a list of compatible vehicles or modifications. GMLS-compatible products should clearly label themselves as such. The NTBI Group does not provide any warranty for third-party GMLS implementations.<br />
<br />
<big>[https://marketplace.secondlife.com/p/GMLS-Development-Kit-Tools-for-Integrating-the-Global-Mod-Link-System/20803262 '''Click here''' for the GMLS developer kit.]</big><br />
<br />
==End-User Instructions==<br />
Refer to your vehicle's owner's guide for instructions on how to install GMLS-compatible equipment.<br />
<br />
If the owner's guide does not provide instructions, the following is a general checklist for installing GMLS-compatible modifications:<br />
<br />
# Ensure that the vehicle is turned off, including any lighting or other components that may change any attributes while installing the modification.<br />
# Take a copy of your vehicle as-is. Modifications may cause damage or unlink prims accidentally. Save a copy now in case this happens!<br />
# Rez the modification near your vehicle.<br />
# Right click the modification and select "Edit".<br />
# With the Edit window open, hold your SHIFT key and left click the vehicle. This should select both objects at once. Make sure you select the vehicle last.<br />
# Press your CTRL + L keys, or click the "Link" button in the Edit window.<br />
# If prompted, confirm that you want to link the two objects together.<br />
# When linked, the modification should automatically position itself to the recommended position and resize if necessary.<br />
# If prompted, grant link permissions. This may unlink some prims. Make sure to delete them after.<br />
# If desired, you may usually move the equipment once linked.<br />
<br />
If a modification does not use GMLS, is not compatible with your vehicle's GMLS system, or returns an error when linking using the above procedure, follow steps 1 through 6, then manually reposition the modification as needed.<br />
<br />
==Aftermarket Modification Manufacturer Instructions==<br />
Get the Alignment Tool and Calibration Tool from the [https://marketplace.secondlife.com/p/GMLS-Development-Kit-Tools-for-Integrating-the-Global-Mod-Link-System/20803262 GMLS developer kit.]<br />
<br />
Before continuing, make sure your mod is finished. Do not continue until you are sure you do not need to make any changes to your object.<br />
<br />
# Make a two copies of your object. One will be used for calibration. The other will be distributed to your end-users.<br />
# Place the "NTBI GMLS Alignment Tool" script in the distribution object (the one you will keep).<br />
# Place the "NTBI GMLS Calibration Tool" script in the calibration object (the one you will link, then delete).<br />
<br />
For each vehicle you want your object to be compatible with:<br />
<br />
# Make a new copy of the calibration object. It should have the "NTBI GMLS Calibration Tool" script already in it.<br />
# Rez the vehicle. Make sure it is the original size!<br />
# Position the calibration object on the vehicle, exactly where you want it to be once installed by the end-user.<br />
# Link the calibration object to the vehicle.<br />
# Copy the script snippet line sent to local chat.<br />
# Open the "NTBI GMLS Alignment Tool" script in the distribution object.<br />
# Paste the script snippet line between the two marked lines at the top of the script. NOTE: The first part of each line is the GMLS ID of the vehicle you have calibrated to. If you see a line with the same GMLS ID, you have already calibrated to that vehicle, and only the first instance of that vehicle will be used.<br />
# Save the "NTBI GMLS Alignment Tool" script.<br />
<br />
Once finished, delete any calibration objects and vehicles.<br />
<br />
If you want the root prim of the object to retain its physics type when linked to the vehicle, change root_no_physics to FALSE. (By default, the root prim of this object will be set to physics type "none" and the physics types of child prims will remain the same.)<br />
<br />
If you want to have the GMLS script automatically unlink prims, list their names in the remove_prims list. If you do this, you can also change remove_move_dist to change the distance unlinked prims will move up, and you can change remove_recolor to FALSE if you do not want unlinked prims to be recolored bright red for visibility.<br />
<br />
If you do not want the object to be set to temporary when unlinking prims in the remove_prims list so that they automatically delete themselves, change make_temp to FALSE.<br />
<br />
When finished, make sure you test your modification on each compatible vehicle to make sure it works correctly.<br />
<br />
===API===<br />
The Alignment Tool and vehicle script send the following link messages that can be used to trigger additional scripts in your modification:<br />
<br />
* <code>GMLS_REQUEST</code><br />
** Sent by Alignment Tool once linked. Vehicle responds with <code>GMLS_ID</code> if compatible. You can also send this manually once the GMLS script is finished if you need any information from <code>GMLS_ID</code>.<br />
* <code>GMLS_ID</code><br />
** '''Key''': [gmls_id]|[root scale]|[additional information]<br />
** Sent by vehicle in response to <code>GMLS_REQUEST</code>. Note that [root scale] is not the ''size'' of the root prim of the vehicle, but rather the ratio of the current size of the root to the original size of the root. For example, [root scale] on a vehicle that was upsized to twice its original size would be <2.0, 2.0, 2.0> regardless of its actual size.<br />
* <code>GMLS_SUCCESS</code><br />
** Sent by Alignment Tool if the GMLS operation completed successfully and it is now safe to perform any configuration changes or whatever else on the newly linked-to vehicle.<br />
* <code>GMLS_FAIL</code><br />
** Sent by Alignment Tool if the GMLS operation failed either because the object the modification was just linked to is not GMLS-compatible or the vehicle has a gmls_id that the modification was not calibrated for.<br />
* <code>GMLS_CANCEL</code><br />
** Sent by Alignment Tool if the GMLS operation was cancelled by the user.<br />
<br />
==Vehicle Manufacturer Instructions==<br />
Get the Alignment Tool and Calibration Tool from the [https://marketplace.secondlife.com/p/GMLS-Development-Kit-Tools-for-Integrating-the-Global-Mod-Link-System/20803262 GMLS developer kit.]<br />
<br />
Before continuing, make sure your vehicle's root prim will not be resized before it is distributed. Do not continue until the root prim is finalized.<br />
<br />
# Place the "NTBI GMLS Vehicle Sample Script" script in the vehicle. If you prefer, you can also integrate this script into another script in the vehicle to save memory.<br />
# Edit the gmls_id string. You can use any string as long as it does not include the pipe ("|") character, but it should be limited to alphanumeric characters, underscores ("_"), and be up to 32 characters. The gmls_id must be unique for every vehicle that has a different layout of potential modification positions. For example, use different IDs for 2DR and 4DR variations of the same vehicle.<br />
# Edit the gmls_default_root_size vector to be the size of the root prim of the vehicle. On most viewers, you can get this value by opening the Edit window, going to the Object tab, and pushing the "C" button next to Size. WARNING: This is not optional. Failure to set this value will cause GMLS modifications to align improperly.<br />
# Save the "NTBI GMLS Vehicle Sample Script" script. If kept separate, you can [http://wiki.secondlife.com/wiki/LlSetMemoryLimit limit the memory used by the script] if you prefer.<br />
<br />
Perform this procedure for each vehicle variation. Once finished, it is a good idea to test the GMLS settings by creating a simple object and following the Aftermarket Modification Manufacturer Instructions.<br />
<br />
==Changelog==<br />
Rev. 2<br />
* Added make_temp option.<br />
* Changed unlinking parts procedure so that unlinked prims are set to temporary if make_temp is enabled.<br />
Rev. 1<br />
* Added GMLS_SUCCESS, GMLS_FAIL, and GMLS_CANCEL link messages.<br />
* Fixed erroring out and refusing to reposition if linked before permissions have been granted.<br />
* Fixed unlinking parts check running before checking if vehicle is compatible in the first place.<br />
* Fixed crosstalk when multiple GMLS modifications are rezzed at once.<br />
* Improved vehicle detection in slow regions by extending identification time from 2 seconds to 5 seconds.<br />
Rev. 0<br />
* Initial public release.</div>NelsonJenkinshttps://wiki.ntbigroup.com/index.php?title=Global_License_Plate_System&diff=2956Global License Plate System2021-04-21T02:48:18Z<p>NelsonJenkins: </p>
<hr />
<div>The '''Global License Plate System (GLPS)''' is a free, open-source license plate system maintained by the NTBI Group. Anyone can attach a GLPS license plate onto their own vehicle and sell their vehicle with GLPS license plates installed.<br />
<br />
==Overview==<br />
GLPS is the combination of a full-permissions model, script, PSD files, and web API. While designed for vehicle manufacturers, GLPS plates can be installed on any modifiable vehicle by simply linking them to the vehicle object.<br />
<br />
GLPS is designed to overcome formatting issues with license plates previously used on NTBI vehicles and those created by some other manufacturers. On those models, characters shown on the plate had to be displayed where the individual character faces were positioned on the model. Instead, GLPS uses an innovative text rendering technique that allows characters to be displayed effectively anywhere on the plate at any size while still using only one texture per font. This also allows GLPS plates to be resized automatically between US/Japan and UK/Euro sizes without needing to duplicate the entire plate for another size, because fonts can be changed and characters can be moved and scaled appropriately for each plate size and design.<br />
<br />
<big>[https://marketplace.secondlife.com/p/GLPS-Development-Kit-Full-Perm-Global-License-Plate-System-Plate/20803261 '''Click here''' for the GLPS developer kit.]</big><br />
<br />
<big>[https://ntbigroup.com/TEMPLATES/GLPS%20TEMPLATE%20JP%20US.psd '''Click here''' for the GLPS JP/US sized custom texture PSD.]</big><br />
<br />
<big>[https://ntbigroup.com/TEMPLATES/GLPS%20TEMPLATE%20EU%20RU%20UK.psd '''Click here''' for the GLPS EU/RU/UK sized custom texture PSD.]</big><br />
<br />
<big>For a list of default templates, scroll to the bottom of the page.</big><br />
<br />
==Compatible Vehicles==<br />
GLPS is being integrated into NTBI vehicles on a rolling basis. However, since GLPS is a free standard, other manufacturers may also implement GLPS on their vehicles.<br />
<br />
==Instructions==<br />
GLPS is very simple to install and use - see the instructions below.<br />
<br />
===For End-Users===<br />
Each manufacturer implements GLPS differently, so refer to your vehicle's owners guide.<br />
<br />
Most vehicles allow you to set a plate by navigating the vehicle's configuration menu.<br />
<br />
If you are developing your own vehicle, or for some reason you cannot access the GLPS configuration menu, drop the ''NTBI GLPS Configuration Tool'' script into the vehicle. It will send the command to open the GLPS configuration menu and immediately delete itself.<br />
<br />
===For Vehicle Developers===<br />
Follow the instructions at the top of the script inside the plate to set it up for your vehicle.<br />
<br />
GLPS plates can be configured two ways - either by sending a command that causes the plate to send the user the GLPS configuration menu, or by sending configuration information directly to the plate.<br />
<br />
To trigger the GLPS configuration menu for the owner, use:<br />
<br />
llMessageLinked(LINK_SET, 0, "GLPS_OPEN_MENU", "");<br />
<br />
To set the plate number, use:<br />
<br />
llMessageLinked(LINK_SET, 0, "GLPS_SET_NUMBER", "[plate number]");<br />
<br />
To load a template directly, use:<br />
<br />
llMessageLinked(LINK_SET, 0, "GLPS_LOAD_TEMPLATE", "[template code]");<br />
<br />
To request the current GLPS config, use:<br />
<br />
llMessageLinked(LINK_SET, 0, "GLPS_GET_DATA", "");<br />
<br />
This will return:<br />
<br />
llMessageLinked(LINK_SET, 0, "GLPS_GOT_DATA", "[JSON object of GLPS config]");<br />
<br />
To load a GLPS config, use:<br />
<br />
llMessageLinked(LINK_SET, 0, "GLPS_LOAD_DATA", "[JSON object of GLPS config]");<br />
<br />
You may also want to set the current template ID using:<br />
<br />
llMessageLinked(LINK_SET, 0, "GLPS_SET_TEMPLATE_ID", "[template code]");<br />
<br />
Note that this will not actually load the template, but can be used to force the template code into memory.<br />
<br />
===For Roleplay Managers and Other Developers===<br />
GLPS plates can be "read" using a chat command, which facilitates simulated ALPR cameras. Communication to the plate is performed on a pseudo-random channel, and communication back to the reader is sent on channel 2250. The command is as follows:<br />
<br />
key vehicle_key = llDetectedKey(0); // this key can be obtained any way you want<br />
llRegionSay(-1 - (integer)("0x" + llGetSubString((string)vehicle_key, -7, -1)), "GLPS_SCAN|" + (string)vehicle_key);<br />
<br />
The response, sent to channel 2250, will be:<br />
<br />
GLPS_SCANNED|[vehicle_key]|[template code]|[plate number]<br />
<br />
<code>[template code]</code> is the code of the default template, if used. If the plate has any modifications, or is using a custom code, <code>[template code]</code> will be "XXXXX".<br />
<br />
==Frequently Asked Questions==<br />
<br />
=====Can I change the number on my plate?=====<br />
<br />
Yes. Open the GLPS configuration menu and select ''Number...'', then enter your desired number. Note that for some plates, such as the default Second Life US-style plate, only a specific number of characters can be entered.<br />
<br />
=====Can I change the plate design/template to something else?=====<br />
<br />
Yes. Open the GLPS configuration menu and select ''Templates...'' -> ''Load...'', then enter the template code of the template you want to use. The template code will load a plate texture, layout, and font. Scroll down for a list of public template codes.<br />
<br />
=====Can I use my own plate textures?=====<br />
<br />
Yes. Open the GLPS configuration menu and select ''Templates...'' -> ''Customize...'' -> ''Texture...'', then paste the texture UUID in the text box. Then, if prompted, select whether you want to apply that texture to the ''Front'', ''Back'', or ''Both'' plates. Then select ''Layout...'' and apply a default layout or change the layout as needed to fit the texture. Then, if desired, select ''Font...'' and select your desired font.<br />
<br />
=====My plate texture already has numbers on it, can I still use it?=====<br />
<br />
Yes. Open the GLPS configuration menu and select ''Number...'' -> ''Clear Number'', then follow the instructions above to use a custom texture UUID.<br />
<br />
=====Why does my plate use an invalid combination of letters and numbers for my state/country? <br>Why does the Japanese plate not use only numbers? <br>Why does the hiragana character on the Japanese plate not match the vehicle type?=====<br />
<br />
Due to how GLPS works, plates are issued semi-randomly using both letters and numbers regardless of whether that would be an appropriate combination in real life for each jurisdiction and vehicle type. If you like, you can change the number to something appropriate.<br />
<br />
=====My country isn't included among the default templates, how do I add it?=====<br />
<br />
Download the PSD file and design a template in Photoshop, or use someone else's template.<br />
<br />
Note that GLPS plates are limited to 7 characters, so some plates (such as those issued in Russia) cannot be rendered fully.<br />
<br />
Note also that characters on GLPS plates are flexible but generally cannot be made small enough to be stacked on top of each other, as seen on certain US specialty plates. Therefore, if you are making a specialty plate template that uses two characters stacked on top of each other, we recommend that you include those characters directly on the template if possible.<br />
<br />
Finally, keep in mind that GLPS can only display 0-9, A-Z, certain Japanese hiragana (see below), and the following special characters: -.: GLPS cannot display registration or inspection stickers, other special characters, or non-English characters.<br />
<br />
If you design a real-life plate template that is not in the default templates, send an IM to Nelson Jenkins and we will review it to see if it would be appropriate to add to the default templates. Note that we will only add templates that are effectively identical to real-life plates.<br />
<br />
=====Why do you call them "license plates" and not "registration plates" or "number plates"?=====<br />
<br />
Because the person who developed GLPS is an American. Sorry.<br />
<br />
=====What plate sizes are available?=====<br />
<br />
GLPS includes, by default, 12x6 inch (305x152 mm) plates for Japan/US and 520x130 mm plates for Europe/Russia/UK. Other sizes may be available for specific jurisdictions, but these two sizes are the only ones that we provide PSDs for.<br />
<br />
Some trivia as to why the UK/Europe GLPS size is not accurate: all US states and Canadian provinces managed to agree on a reasonable, delightfully proportional 12x6 inch standard all the way back in 1956, which fits perfectly onto a 512x256 px texture. Europe, meanwhile, mostly uses 520x110 mm or 520x120 mm plates with horrendous 52:11 and 13:3 aspect ratios, with many countries using completely different sizes for no clear reason, including some even using the 12x6 inch format. Because of this, GLPS also bucks the trend with a "standard" 520x130 mm plate to facilitate the use of a 512x128 px texture.<br />
<br />
=====Are motorcycle plates available?=====<br />
<br />
While GLPS does not include any templates for smaller motorcycle plates, you may create your own using the PSD file and instructions above. However, it will be difficult if not impossible to render characters in two rows as seen on most European motorcycle plates due to technical limitations of the font textures.<br />
<br />
=====What information is stored by the GLPS web API?=====<br />
<br />
The GLPS API, hosted by Northbridge Business Systems, only stores the plate template (design only, no text) and plate owner's UUID when copying a plate template code. This data is not available to the public and is only used for detecting abuse of the template code generation service. This service is necessary because plate configurations are very long and are not easy to load into the plate manually. GLPS does not store any information about the vehicle, such as its position, speed, driver, or model, except for the vehicle owner's UUID as a consequence of storing the plate owner's UUID.<br />
<br />
=====Why is an NBS API key required?=====<br />
The GLPS API hosts saved plate data as described above. There is currently no limit to the number of plates any one person can save. To allow NBS to monitor the system for abuse, an NBS API key is required for calls that either read or store custom plate data.<br />
<br />
=====How are default plate numbers assigned?=====<br />
<br />
Plate numbers are generated as seven-digit strings, and if the plate template cannot display seven digits, only the first digits are displayed up to the maximum. The first two characters are random alphanumeric characters, the third character is the first character of the region name that the car is first rezzed in, the fourth through sixth characters are the last three digits of the current Unix timestamp, and the last character is a random alphanumeric character.<br />
<br />
=====Are plate numbers unique or searchable?=====<br />
<br />
No. Due to privacy concerns, we chose to make plate numbers pseudo-random and they might not be unique. However, plate numbers only change when the vehicle owner changes or the plate is edited by the user, so plate numbers will persist even if the vehicle is taken and re-rezzed.<br />
<br />
=====Why is the layout/font not accurate for my state/country?=====<br />
<br />
We have tried to implement as many plate designs as we could, but the person who developed GLPS is a stupid American, so many of the European plates are wrong because we do not have access to every accurate font, and we do not have the time to make sure every state plate is pixel-perfect. Different states and countries use a wide variety of fonts, layouts, decals, additional stickers, and sizes. We have attempted to emulate these formats, but the layout and font may not be completely accurate in every case.<br />
<br />
=====For European plates with inspection stickers, can they be changed?=====<br />
<br />
While you are welcome to make your own inspection sticker, the sticker on the template is the only inspection sticker possible by default. We have thus attempted to avoid referring to any specific year on the default templates.<br />
<br />
=====For Russian plates, can the region number be changed to not say "SL"?=====<br />
<br />
No. Due to the fact that GLPS can only render 7 characters, the region code was replaced with "SL", but you can edit the default template to set a custom region number if you like.<br />
<br />
=====What does the Japanese plate say at the top?=====<br />
<br />
The kanji at the top reads "import" and the number to the right is the vehicle class code, which is estimated depending on the plate type you use, but can be edited (see above). Realistically, the kanji would indicate the local office that issued the plate, but incorporating all of the possible office codes would make the characters unreadable. For more information, [https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Japan see the relevant Wikipedia article.] It is also possible that the kanji reads something totally nonsensical or that we glossed over an appropriate real-life alternative that could have been used, since the person who developed GLPS is a baka gaijin.<br />
<br />
=====For Japanese plates, can I change the issuing office and class codes at the top of the plate?=====<br />
<br />
Yes, but this can only be done by making your own texture using the PSD file in Photoshop. Due to Second Life limitations, only the hiragana character and sequential digits can be changed in-world.<br />
<br />
=====For Japanese plates, how do I display dots instead of leading zeroes?=====<br />
<br />
Use ":" (the colon punctuation mark) for each centered dot.<br />
<br />
=====For Japanese plates, how do I enter the hiragana character?=====<br />
<br />
GLPS will accept hiragana in the number input. Alternatively, you can use the following romanji and punctuation that are mapped to the following hiragana:<br />
<br />
{| class="wikitable" style="text-align:center;"<br />
|-<br />
! 0 || 1 || 2 || 3 || 4 || 5 || 6 || 7 || 8 || 9 || A || B || C || D || E || F || G || H || I || J<br />
|-<br />
| さ || す || せ || そ || た || ち || つ || て || と || な || に || ぬ || ね || の || は || ひ || ふ || ほ || ま || み<br />
|-<br />
! K || L || M || N || O || P || Q || R || S || T || U || V || W || X || Y || Z || - || . || : || @<br />
|-<br />
| む || め || も || や || ゆ || よ || ら || り || る || ろ || あ || い || う || え || か || き || く || け || こ || を<br />
|}<br />
<br />
Note that the hiragana mapped to 0-9 and A-T are used on private vehicles and those mapped to U-Z and punctuation are used on commercial vehicles, though due to the nature of GLPS, these combinations are not always accurate. Also, GLPS does not support the れ and わ "rental vehicle" hiragana due to space limitations, and does not support any of the following hiragana not valid on license plates: 'ばだがぱざびぢぎぴじぶづぐぷずべでげペぜぼどごぽぞゑゐ<br />
<br />
==Default Templates==<br />
<br />
Below is a list of default template codes:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Code || Size || Digits || Description<br />
|-<br />
| GLPSD/SLUSS || JP/US || 6 || Second Life Default (US Style)<br />
|-<br />
| GLPSD/SLUSV || JP/US || 1-7 || Second Life Vanity (US Style)<br />
|-<br />
| GLPSD/SLMBE || JP/US || 1-7 || Second Life Mainland - Bellisseria<br />
|-<br />
| GLPSD/SLMBS || JP/US || 1-7 || Second Life Mainland - Blake Sea<br />
|-<br />
| GLPSD/SLMCO || JP/US || 1-7 || Second Life Mainland - Corsica<br />
|-<br />
| GLPSD/SLMGI || JP/US || 1-7 || Second Life Mainland - Gaeta Islands<br />
|-<br />
| GLPSD/SLMHE || JP/US || 1-7 || Second Life Mainland - Heterocera<br />
|-<br />
| GLPSD/SLMJE || JP/US || 1-7 || Second Life Mainland - Jeogeot<br />
|-<br />
| GLPSD/SLMNA || JP/US || 1-7 || Second Life Mainland - Nautilus<br />
|-<br />
| GLPSD/SLMSA || JP/US || 1-7 || Second Life Mainland - Sansara<br />
|-<br />
| GLPSD/SLMST || JP/US || 1-7 || Second Life Mainland - Satori<br />
|-<br />
| GLPSD/SLMSC || JP/US || 1-7 || Second Life Mainland - Sharp Continent<br />
|-<br />
| GLPSD/SLMZI || JP/US || 1-7 || Second Life Mainland - Zindra<br />
|-<br />
| GLPSD/JPPSS || JP/US || 5 || Japan - Private<br />
|-<br />
| GLPSD/JPPKS || JP/US || 5 || Japan - Private Kei<br />
|-<br />
| GLPSD/JPCSS || JP/US || 5 || Japan - Commercial<br />
|-<br />
| GLPSD/JPCKS || JP/US || 5 || Japan - Commercial Kei<br />
|-<br />
| GLPSD/JPTPS || JP/US || 5 || Japan - Temporary<br />
|-<br />
| GLPSD/USCAS || JP/US || 1-7 || United States - California<br />
|-<br />
| GLPSD/USCAB || JP/US || 1-7 || United States - California (Black)<br />
|-<br />
| GLPSD/USNJS || JP/US || 6 || United States - New Jersey<br />
|-<br />
| GLPSD/USNJV || JP/US || 1-7 || United States - New Jersey Vanity<br />
|-<br />
| GLPSD/USNYS || JP/US || 7 || United States - New York<br />
|-<br />
| GLPSD/USNYV || JP/US || 1-7 || United States - New York Vanity<br />
|-<br />
| GLPSD/USNYA || JP/US || 7 || United States - New York (2010s)<br />
|-<br />
| GLPSD/USNYB || JP/US || 1-7 || United States - New York Vanity (2010s)<br />
|-<br />
| GLPSD/USNYC || JP/US || 1-7 || United States - New York Livery (2010s)<br />
|-<br />
| GLPSD/USNYD || JP/US || 1-7 || United States - New York T&LC (2010s)<br />
|-<br />
| GLPSD/USNYE || JP/US || 7 || United States - New York (2000s)<br />
|-<br />
| GLPSD/USNYF || JP/US || 1-7 || United States - New York Vanity (2000s)<br />
|-<br />
| GLPSD/USNYG || JP/US || 1-7 || United States - New York Livery (2000s)<br />
|-<br />
| GLPSD/USNYH || JP/US || 1-7 || United States - New York T&LC (2000s)<br />
|-<br />
| GLPSD/USNYI || JP/US || 6 || United States - New York (1990s)<br />
|-<br />
| GLPSD/USNYJ || JP/US || 6 || United States - New York Vanity (1990s)<br />
|-<br />
| GLPSD/USNYK || JP/US || 6 || United States - New York Livery (1990s)<br />
|-<br />
| GLPSD/USNYL || JP/US || 6 || United States - New York T&LC (1990s)<br />
|-<br />
| GLPSD/USNYM || JP/US || 6 || United States - New York Commercial (1990s)<br />
|-<br />
| GLPSD/USPAS || JP/US || 7 || United States - Pennsylvania<br />
|-<br />
| GLPSD/USPAV || JP/US || 1-7 || United States - Pennsylvania Vanity<br />
|-<br />
| GLPSD/USTXS || JP/US || 7 || United States - Texas<br />
|-<br />
| GLPSD/USTXV || JP/US || 1-7 || United States - Texas Vanity<br />
|-<br />
| GLPSD/SLEUS || EU/RU/UK || 1-7 || Second Life Default (EU Style)<br />
|-<br />
| GLPSD/EUALS || EU/RU/UK || 7 || Albania<br />
|-<br />
| GLPSD/EUAAS || EU/RU/UK || 6 || Austria<br />
|-<br />
| GLPSD/EUBYS || EU/RU/UK || 7 || Belarus<br />
|-<br />
| GLPSD/EUBBS || EU/RU/UK || 7 || Belgium<br />
|-<br />
| GLPSD/EUBIS || EU/RU/UK || 7 || Bosnia and Herzegovina<br />
|-<br />
| GLPSD/EUBGS || EU/RU/UK || 7 || Bulgaria<br />
|-<br />
| GLPSD/EUHRS || EU/RU/UK || 7 || Croatia<br />
|-<br />
| GLPSD/EUCZS || EU/RU/UK || 7 || Czech Republic<br />
|-<br />
| GLPSD/EUDKS || EU/RU/UK || 7 || Denmark<br />
|-<br />
| GLPSD/EUDKC || EU/RU/UK || 7 || Denmark - Commercial<br />
|-<br />
| GLPSD/EUDKP || EU/RU/UK || 7 || Denmark - "Parrot"<br />
|-<br />
| GLPSD/EUESS || EU/RU/UK || 6 || Estonia<br />
|-<br />
| GLPSD/EUFIS || EU/RU/UK || 6 || Finland<br />
|-<br />
| GLPSD/EUFFS || EU/RU/UK || 7 || France<br />
|-<br />
| GLPSD/EUDDS || EU/RU/UK || 7 || Germany<br />
|-<br />
| GLPSD/EUGRS || EU/RU/UK || 7 || Greece<br />
|-<br />
| GLPSD/EUHHS || EU/RU/UK || 6 || Hungary<br />
|-<br />
| GLPSD/EUISS || EU/RU/UK || 5 || Iceland<br />
|-<br />
| GLPSD/EUIRS || EU/RU/UK || 7 || Ireland<br />
|-<br />
| GLPSD/EUIIS || EU/RU/UK || 7 || Italy<br />
|-<br />
| GLPSD/EULVS || EU/RU/UK || 6 || Latvia<br />
|-<br />
| GLPSD/EULIS || EU/RU/UK || 7 || Liechtenstein<br />
|-<br />
| GLPSD/EULTS || EU/RU/UK || 6 || Lithuania<br />
|-<br />
| GLPSD/EULLS || EU/RU/UK || 6 || Luxembourg<br />
|-<br />
| GLPSD/EUMMS || EU/RU/UK || 6 || Malta<br />
|-<br />
| GLPSD/EUMDS || EU/RU/UK || 6 || Moldova<br />
|-<br />
| GLPSD/EUMNS || EU/RU/UK || 7 || Montenegro<br />
|-<br />
| GLPSD/EUNLS || EU/RU/UK || 6 || Netherlands<br />
|-<br />
| GLPSD/EUNMS || EU/RU/UK || 7 || North Macedonia<br />
|-<br />
| GLPSD/EUNNS || EU/RU/UK || 7 || Norway<br />
|-<br />
| GLPSD/EUPLS || EU/RU/UK || 7 || Poland<br />
|-<br />
| GLPSD/EUPPS || EU/RU/UK || 6 || Portugal<br />
|-<br />
| GLPSD/EUROS || EU/RU/UK || 7 || Romania<br />
|-<br />
| GLPSD/EUSRS || EU/RU/UK || 7 || Serbia<br />
|-<br />
| GLPSD/EUSKS || EU/RU/UK || 7 || Slovakia<br />
|-<br />
| GLPSD/EUSLS || EU/RU/UK || 7 || Slovenia<br />
|-<br />
| GLPSD/EUEES || EU/RU/UK || 7 || Spain<br />
|-<br />
| GLPSD/EUSSS || EU/RU/UK || 6 || Sweden<br />
|-<br />
| GLPSD/EUUAS || EU/RU/UK || 7 || Ukraine<br />
|-<br />
| GLPSD/RURUS || EU/RU/UK || 6 || Russia<br />
|-<br />
| GLPSD/UKUKS || EU/RU/UK || 7 || United Kingdom (Front/Rear)<br />
|-<br />
| GLPSD/UKEUS || EU/RU/UK || 7 || United Kingdom EU (Front/Rear)<br />
|-<br />
| GLPSD/THPCS || Custom || 6 || Thailand - Private Car<br />
|-<br />
| GLPSD/THPVS || Custom || 6 || Thailand - Private Van<br />
|-<br />
| GLPSD/THPPS || Custom || 6 || Thailand - Private 2DR Pickup<br />
|-<br />
| GLPSD/THPTS || Custom || 6 || Thailand - Private Motorized Tricycle<br />
|-<br />
| GLPSD/THTCS || Custom || 6 || Thailand - Taxi<br />
|-<br />
| GLPSD/THSCS || Custom || 6 || Thailand - Service Vehicle<br />
|}<br />
<br />
==Default Fonts==<br />
<br />
Below is a list of default font codes:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Code || Description<br />
|-<br />
| US1 || United States - Generic 1<br />
|-<br />
| US2 || United States - Generic 2<br />
|-<br />
| USCA || United States - California<br />
|-<br />
| USFL || United States - Florida<br />
|-<br />
| USIL || United States - Illinois<br />
|-<br />
| USMA || United States - Massachusetts<br />
|-<br />
| USMD || United States - Maryland<br />
|-<br />
| USMI || United States - Michigan<br />
|-<br />
| USMO || United States - Missouri<br />
|-<br />
| USNC || United States - North Carolina<br />
|-<br />
| USNJ || United States - New Jersey<br />
|-<br />
| USNY || United States - New York<br />
|-<br />
| USOH || United States - Ohio<br />
|-<br />
| USPA || United States - Pennsylvania<br />
|-<br />
| USVA || United States - Virginia<br />
|-<br />
| USWA || United States - Washington<br />
|-<br />
| USWI || United States - Wisconsin<br />
|-<br />
| CAON || Canada - Ontario<br />
|-<br />
| CAQC || Canada - Quebec<br />
|-<br />
| UK || United Kingdom<br />
|-<br />
| EU1 || Europe - Generic 1<br />
|-<br />
| EU2 || Europe - Generic 2<br />
|-<br />
| EU3 || Europe - Generic 3<br />
|-<br />
| JPR || Japan - Romaji/Numerals<br />
|-<br />
| JPH || Japan - Hiragana<br />
|}<br />
<br />
==Changelog==<br />
Rev. 2<br />
* Fixed current prim height/width being displayed incorrectly in menu.<br />
* Fixed prim height/width being prompted for in millimeters but being applied as meters.<br />
* Fixed rare issue when changing colors that caused copying plate via API to return invalid_api_key.<br />
Rev. 1<br />
* Added ability to change minimum and maximum characters on template.<br />
* Fixed GLPS plate scanning API.<br />
Rev. 0<br />
* Initial public release.</div>NelsonJenkinshttps://wiki.ntbigroup.com/index.php?title=Global_License_Plate_System&diff=2955Global License Plate System2021-04-10T20:19:50Z<p>NelsonJenkins: </p>
<hr />
<div>The '''Global License Plate System (GLPS)''' is a free, open-source license plate system maintained by the NTBI Group. Anyone can attach a GLPS license plate onto their own vehicle and sell their vehicle with GLPS license plates installed.<br />
<br />
==Overview==<br />
GLPS is the combination of a full-permissions model, script, PSD files, and web API. While designed for vehicle manufacturers, GLPS plates can be installed on any modifiable vehicle by simply linking them to the vehicle object.<br />
<br />
GLPS is designed to overcome formatting issues with license plates previously used on NTBI vehicles and those created by some other manufacturers. On those models, characters shown on the plate had to be displayed where the individual character faces were positioned on the model. Instead, GLPS uses an innovative text rendering technique that allows characters to be displayed effectively anywhere on the plate at any size while still using only one texture per font. This also allows GLPS plates to be resized automatically between US/Japan and UK/Euro sizes without needing to duplicate the entire plate for another size, because fonts can be changed and characters can be moved and scaled appropriately for each plate size and design.<br />
<br />
<big>[https://marketplace.secondlife.com/p/GLPS-Development-Kit-Full-Perm-Global-License-Plate-System-Plate/20803261 '''Click here''' for the GLPS developer kit.]</big><br />
<br />
<big>[https://ntbigroup.com/TEMPLATES/GLPS%20TEMPLATE%20JP%20US.psd '''Click here''' for the GLPS JP/US sized custom texture PSD.]</big><br />
<br />
<big>[https://ntbigroup.com/TEMPLATES/GLPS%20TEMPLATE%20EU%20RU%20UK.psd '''Click here''' for the GLPS EU/RU/UK sized custom texture PSD.]</big><br />
<br />
<big>For a list of default templates, scroll to the bottom of the page.</big><br />
<br />
==Compatible Vehicles==<br />
GLPS is being integrated into NTBI vehicles on a rolling basis. However, since GLPS is a free standard, other manufacturers may also implement GLPS on their vehicles.<br />
<br />
==Instructions==<br />
GLPS is very simple to install and use - see the instructions below.<br />
<br />
===For End-Users===<br />
Each manufacturer implements GLPS differently, so refer to your vehicle's owners guide.<br />
<br />
Most vehicles allow you to set a plate by navigating the vehicle's configuration menu.<br />
<br />
If you are developing your own vehicle, or for some reason you cannot access the GLPS configuration menu, drop the ''NTBI GLPS Configuration Tool'' script into the vehicle. It will send the command to open the GLPS configuration menu and immediately delete itself.<br />
<br />
===For Vehicle Developers===<br />
Follow the instructions at the top of the script inside the plate to set it up for your vehicle.<br />
<br />
GLPS plates can be configured two ways - either by sending a command that causes the plate to send the user the GLPS configuration menu, or by sending configuration information directly to the plate.<br />
<br />
To trigger the GLPS configuration menu for the owner, use:<br />
<br />
llMessageLinked(LINK_SET, 0, "GLPS_OPEN_MENU", "");<br />
<br />
To set the plate number, use:<br />
<br />
llMessageLinked(LINK_SET, 0, "GLPS_SET_NUMBER", "[plate number]");<br />
<br />
To load a template directly, use:<br />
<br />
llMessageLinked(LINK_SET, 0, "GLPS_LOAD_TEMPLATE", "[template code]");<br />
<br />
To request the current GLPS config, use:<br />
<br />
llMessageLinked(LINK_SET, 0, "GLPS_GET_DATA", "");<br />
<br />
This will return:<br />
<br />
llMessageLinked(LINK_SET, 0, "GLPS_GOT_DATA", "[JSON object of GLPS config]");<br />
<br />
To load a GLPS config, use:<br />
<br />
llMessageLinked(LINK_SET, 0, "GLPS_LOAD_DATA", "[JSON object of GLPS config]");<br />
<br />
You may also want to set the current template ID using:<br />
<br />
llMessageLinked(LINK_SET, 0, "GLPS_SET_TEMPLATE_ID", "[template code]");<br />
<br />
Note that this will not actually load the template, but can be used to force the template code into memory.<br />
<br />
===For Roleplay Managers and Other Developers===<br />
GLPS plates can be "read" using a chat command, which facilitates simulated ALPR cameras. Communication to the plate is performed on a pseudo-random channel, and communication back to the reader is sent on channel 2250. The command is as follows:<br />
<br />
key vehicle_key = llDetectedKey(0); // this key can be obtained any way you want<br />
llRegionSay(-1 - (integer)("0x" + llGetSubString((string)vehicle_key, -7, -1)), "GLPS_SCAN|" + (string)vehicle_key);<br />
<br />
The response, sent to channel 2250, will be:<br />
<br />
GLPS_SCANNED|[vehicle_key]|[template code]|[plate number]<br />
<br />
<code>[template code]</code> is the code of the default template, if used. If the plate has any modifications, or is using a custom code, <code>[template code]</code> will be "XXXXX".<br />
<br />
==Frequently Asked Questions==<br />
<br />
=====Can I change the number on my plate?=====<br />
<br />
Yes. Open the GLPS configuration menu and select ''Number...'', then enter your desired number. Note that for some plates, such as the default Second Life US-style plate, only a specific number of characters can be entered.<br />
<br />
=====Can I change the plate design/template to something else?=====<br />
<br />
Yes. Open the GLPS configuration menu and select ''Templates...'' -> ''Load...'', then enter the template code of the template you want to use. The template code will load a plate texture, layout, and font. Scroll down for a list of public template codes.<br />
<br />
=====Can I use my own plate textures?=====<br />
<br />
Yes. Open the GLPS configuration menu and select ''Templates...'' -> ''Customize...'' -> ''Texture...'', then paste the texture UUID in the text box. Then, if prompted, select whether you want to apply that texture to the ''Front'', ''Back'', or ''Both'' plates. Then select ''Layout...'' and apply a default layout or change the layout as needed to fit the texture. Then, if desired, select ''Font...'' and select your desired font.<br />
<br />
=====My plate texture already has numbers on it, can I still use it?=====<br />
<br />
Yes. Open the GLPS configuration menu and select ''Number...'' -> ''Clear Number'', then follow the instructions above to use a custom texture UUID.<br />
<br />
=====Why does my plate use an invalid combination of letters and numbers for my state/country? <br>Why does the Japanese plate not use only numbers? <br>Why does the hiragana character on the Japanese plate not match the vehicle type?=====<br />
<br />
Due to how GLPS works, plates are issued semi-randomly using both letters and numbers regardless of whether that would be an appropriate combination in real life for each jurisdiction and vehicle type. If you like, you can change the number to something appropriate.<br />
<br />
=====My country isn't included among the default templates, how do I add it?=====<br />
<br />
Download the PSD file and design a template in Photoshop, or use someone else's template.<br />
<br />
Note that GLPS plates are limited to 7 characters, so some plates (such as those issued in Russia) cannot be rendered fully.<br />
<br />
Note also that characters on GLPS plates are flexible but generally cannot be made small enough to be stacked on top of each other, as seen on certain US specialty plates. Therefore, if you are making a specialty plate template that uses two characters stacked on top of each other, we recommend that you include those characters directly on the template if possible.<br />
<br />
Finally, keep in mind that GLPS can only display 0-9, A-Z, certain Japanese hiragana (see below), and the following special characters: -.: GLPS cannot display registration or inspection stickers, other special characters, or non-English characters.<br />
<br />
If you design a real-life plate template that is not in the default templates, send an IM to Nelson Jenkins and we will review it to see if it would be appropriate to add to the default templates. Note that we will only add templates that are effectively identical to real-life plates.<br />
<br />
=====Why do you call them "license plates" and not "registration plates" or "number plates"?=====<br />
<br />
Because the person who developed GLPS is an American. Sorry.<br />
<br />
=====What plate sizes are available?=====<br />
<br />
GLPS includes, by default, 12x6 inch (305x152 mm) plates for Japan/US and 520x130 mm plates for Europe/Russia/UK. Other sizes may be available for specific jurisdictions, but these two sizes are the only ones that we provide PSDs for.<br />
<br />
Some trivia as to why the UK/Europe GLPS size is not accurate: all US states and Canadian provinces managed to agree on a reasonable, delightfully proportional 12x6 inch standard all the way back in 1956, which fits perfectly onto a 512x256 px texture. Europe, meanwhile, mostly uses 520x110 mm or 520x120 mm plates with horrendous 52:11 and 13:3 aspect ratios, with many countries using completely different sizes for no clear reason, including some even using the 12x6 inch format. Because of this, GLPS also bucks the trend with a "standard" 520x130 mm plate to facilitate the use of a 512x128 px texture.<br />
<br />
=====Are motorcycle plates available?=====<br />
<br />
While GLPS does not include any templates for smaller motorcycle plates, you may create your own using the PSD file and instructions above. However, it will be difficult if not impossible to render characters in two rows as seen on most European motorcycle plates due to technical limitations of the font textures.<br />
<br />
=====What information is stored by the GLPS web API?=====<br />
<br />
The GLPS API, hosted by Northbridge Business Systems, only stores the plate template (design only, no text) and plate owner's UUID when copying a plate template code. This data is not available to the public and is only used for detecting abuse of the template code generation service. This service is necessary because plate configurations are very long and are not easy to load into the plate manually. GLPS does not store any information about the vehicle, such as its position, speed, driver, or model, except for the vehicle owner's UUID as a consequence of storing the plate owner's UUID.<br />
<br />
=====Why is an NBS API key required?=====<br />
The GLPS API hosts saved plate data as described above. There is currently no limit to the number of plates any one person can save. To allow NBS to monitor the system for abuse, an NBS API key is required for calls that either read or store custom plate data.<br />
<br />
=====How are default plate numbers assigned?=====<br />
<br />
Plate numbers are generated as seven-digit strings, and if the plate template cannot display seven digits, only the first digits are displayed up to the maximum. The first two characters are random alphanumeric characters, the third character is the first character of the region name that the car is first rezzed in, the fourth through sixth characters are the last three digits of the current Unix timestamp, and the last character is a random alphanumeric character.<br />
<br />
=====Are plate numbers unique or searchable?=====<br />
<br />
No. Due to privacy concerns, we chose to make plate numbers pseudo-random and they might not be unique. However, plate numbers only change when the vehicle owner changes or the plate is edited by the user, so plate numbers will persist even if the vehicle is taken and re-rezzed.<br />
<br />
=====Why is the layout/font not accurate for my state/country?=====<br />
<br />
We have tried to implement as many plate designs as we could, but the person who developed GLPS is a stupid American, so many of the European plates are wrong because we do not have access to every accurate font, and we do not have the time to make sure every state plate is pixel-perfect. Different states and countries use a wide variety of fonts, layouts, decals, additional stickers, and sizes. We have attempted to emulate these formats, but the layout and font may not be completely accurate in every case.<br />
<br />
=====For European plates with inspection stickers, can they be changed?=====<br />
<br />
While you are welcome to make your own inspection sticker, the sticker on the template is the only inspection sticker possible by default. We have thus attempted to avoid referring to any specific year on the default templates.<br />
<br />
=====For Russian plates, can the region number be changed to not say "SL"?=====<br />
<br />
No. Due to the fact that GLPS can only render 7 characters, the region code was replaced with "SL", but you can edit the default template to set a custom region number if you like.<br />
<br />
=====What does the Japanese plate say at the top?=====<br />
<br />
The kanji at the top reads "import" and the number to the right is the vehicle class code, which is estimated depending on the plate type you use, but can be edited (see above). Realistically, the kanji would indicate the local office that issued the plate, but incorporating all of the possible office codes would make the characters unreadable. For more information, [https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Japan see the relevant Wikipedia article.] It is also possible that the kanji reads something totally nonsensical or that we glossed over an appropriate real-life alternative that could have been used, since the person who developed GLPS is a baka gaijin.<br />
<br />
=====For Japanese plates, can I change the issuing office and class codes at the top of the plate?=====<br />
<br />
Yes, but this can only be done by making your own texture using the PSD file in Photoshop. Due to Second Life limitations, only the hiragana character and sequential digits can be changed in-world.<br />
<br />
=====For Japanese plates, how do I display dots instead of leading zeroes?=====<br />
<br />
Use ":" (the colon punctuation mark) for each centered dot.<br />
<br />
=====For Japanese plates, how do I enter the hiragana character?=====<br />
<br />
GLPS will accept hiragana in the number input. Alternatively, you can use the following romanji and punctuation that are mapped to the following hiragana:<br />
<br />
{| class="wikitable" style="text-align:center;"<br />
|-<br />
! 0 || 1 || 2 || 3 || 4 || 5 || 6 || 7 || 8 || 9 || A || B || C || D || E || F || G || H || I || J<br />
|-<br />
| さ || す || せ || そ || た || ち || つ || て || と || な || に || ぬ || ね || の || は || ひ || ふ || ほ || ま || み<br />
|-<br />
! K || L || M || N || O || P || Q || R || S || T || U || V || W || X || Y || Z || - || . || : || @<br />
|-<br />
| む || め || も || や || ゆ || よ || ら || り || る || ろ || あ || い || う || え || か || き || く || け || こ || を<br />
|}<br />
<br />
Note that the hiragana mapped to 0-9 and A-T are used on private vehicles and those mapped to U-Z and punctuation are used on commercial vehicles, though due to the nature of GLPS, these combinations are not always accurate. Also, GLPS does not support the れ and わ "rental vehicle" hiragana due to space limitations, and does not support any of the following hiragana not valid on license plates: 'ばだがぱざびぢぎぴじぶづぐぷずべでげペぜぼどごぽぞゑゐ<br />
<br />
==Default Templates==<br />
<br />
Below is a list of default template codes:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Code || Size || Digits || Description<br />
|-<br />
| GLPSD/SLUSS || JP/US || 6 || Second Life Default (US Style)<br />
|-<br />
| GLPSD/SLUSV || JP/US || 1-7 || Second Life Vanity (US Style)<br />
|-<br />
| GLPSD/SLMBE || JP/US || 1-7 || Second Life Mainland - Bellisseria<br />
|-<br />
| GLPSD/SLMBS || JP/US || 1-7 || Second Life Mainland - Blake Sea<br />
|-<br />
| GLPSD/SLMCO || JP/US || 1-7 || Second Life Mainland - Corsica<br />
|-<br />
| GLPSD/SLMGI || JP/US || 1-7 || Second Life Mainland - Gaeta Islands<br />
|-<br />
| GLPSD/SLMHE || JP/US || 1-7 || Second Life Mainland - Heterocera<br />
|-<br />
| GLPSD/SLMJE || JP/US || 1-7 || Second Life Mainland - Jeogeot<br />
|-<br />
| GLPSD/SLMNA || JP/US || 1-7 || Second Life Mainland - Nautilus<br />
|-<br />
| GLPSD/SLMSA || JP/US || 1-7 || Second Life Mainland - Sansara<br />
|-<br />
| GLPSD/SLMST || JP/US || 1-7 || Second Life Mainland - Satori<br />
|-<br />
| GLPSD/SLMSC || JP/US || 1-7 || Second Life Mainland - Sharp Continent<br />
|-<br />
| GLPSD/SLMZI || JP/US || 1-7 || Second Life Mainland - Zindra<br />
|-<br />
| GLPSD/JPPSS || JP/US || 5 || Japan - Private<br />
|-<br />
| GLPSD/JPPKS || JP/US || 5 || Japan - Private Kei<br />
|-<br />
| GLPSD/JPCSS || JP/US || 5 || Japan - Commercial<br />
|-<br />
| GLPSD/JPCKS || JP/US || 5 || Japan - Commercial Kei<br />
|-<br />
| GLPSD/JPTPS || JP/US || 5 || Japan - Temporary<br />
|-<br />
| GLPSD/USCAS || JP/US || 1-7 || United States - California<br />
|-<br />
| GLPSD/USCAB || JP/US || 1-7 || United States - California (Black)<br />
|-<br />
| GLPSD/USNJS || JP/US || 6 || United States - New Jersey<br />
|-<br />
| GLPSD/USNJV || JP/US || 1-7 || United States - New Jersey Vanity<br />
|-<br />
| GLPSD/USNYS || JP/US || 7 || United States - New York<br />
|-<br />
| GLPSD/USNYV || JP/US || 1-7 || United States - New York Vanity<br />
|-<br />
| GLPSD/USNYA || JP/US || 7 || United States - New York (2010s)<br />
|-<br />
| GLPSD/USNYB || JP/US || 1-7 || United States - New York Vanity (2010s)<br />
|-<br />
| GLPSD/USNYC || JP/US || 1-7 || United States - New York Livery (2010s)<br />
|-<br />
| GLPSD/USNYD || JP/US || 1-7 || United States - New York T&LC (2010s)<br />
|-<br />
| GLPSD/USNYE || JP/US || 7 || United States - New York (2000s)<br />
|-<br />
| GLPSD/USNYF || JP/US || 1-7 || United States - New York Vanity (2000s)<br />
|-<br />
| GLPSD/USNYG || JP/US || 1-7 || United States - New York Livery (2000s)<br />
|-<br />
| GLPSD/USNYH || JP/US || 1-7 || United States - New York T&LC (2000s)<br />
|-<br />
| GLPSD/USNYI || JP/US || 6 || United States - New York (1990s)<br />
|-<br />
| GLPSD/USNYJ || JP/US || 6 || United States - New York Vanity (1990s)<br />
|-<br />
| GLPSD/USNYK || JP/US || 6 || United States - New York Livery (1990s)<br />
|-<br />
| GLPSD/USNYL || JP/US || 6 || United States - New York T&LC (1990s)<br />
|-<br />
| GLPSD/USNYM || JP/US || 6 || United States - New York Commercial (1990s)<br />
|-<br />
| GLPSD/USPAS || JP/US || 7 || United States - Pennsylvania<br />
|-<br />
| GLPSD/USPAV || JP/US || 1-7 || United States - Pennsylvania Vanity<br />
|-<br />
| GLPSD/USTXS || JP/US || 7 || United States - Texas<br />
|-<br />
| GLPSD/USTXV || JP/US || 1-7 || United States - Texas Vanity<br />
|-<br />
| GLPSD/SLEUS || EU/RU/UK || 1-7 || Second Life Default (EU Style)<br />
|-<br />
| GLPSD/EUALS || EU/RU/UK || 7 || Albania<br />
|-<br />
| GLPSD/EUAAS || EU/RU/UK || 6 || Austria<br />
|-<br />
| GLPSD/EUBYS || EU/RU/UK || 7 || Belarus<br />
|-<br />
| GLPSD/EUBBS || EU/RU/UK || 7 || Belgium<br />
|-<br />
| GLPSD/EUBIS || EU/RU/UK || 7 || Bosnia and Herzegovina<br />
|-<br />
| GLPSD/EUBGS || EU/RU/UK || 7 || Bulgaria<br />
|-<br />
| GLPSD/EUHRS || EU/RU/UK || 7 || Croatia<br />
|-<br />
| GLPSD/EUCZS || EU/RU/UK || 7 || Czech Republic<br />
|-<br />
| GLPSD/EUDKS || EU/RU/UK || 7 || Denmark<br />
|-<br />
| GLPSD/EUDKC || EU/RU/UK || 7 || Denmark - Commercial<br />
|-<br />
| GLPSD/EUDKP || EU/RU/UK || 7 || Denmark - "Parrot"<br />
|-<br />
| GLPSD/EUESS || EU/RU/UK || 6 || Estonia<br />
|-<br />
| GLPSD/EUFIS || EU/RU/UK || 6 || Finland<br />
|-<br />
| GLPSD/EUFFS || EU/RU/UK || 7 || France<br />
|-<br />
| GLPSD/EUDDS || EU/RU/UK || 7 || Germany<br />
|-<br />
| GLPSD/EUGRS || EU/RU/UK || 7 || Greece<br />
|-<br />
| GLPSD/EUHHS || EU/RU/UK || 6 || Hungary<br />
|-<br />
| GLPSD/EUISS || EU/RU/UK || 5 || Iceland<br />
|-<br />
| GLPSD/EUIRS || EU/RU/UK || 7 || Ireland<br />
|-<br />
| GLPSD/EUIIS || EU/RU/UK || 7 || Italy<br />
|-<br />
| GLPSD/EULVS || EU/RU/UK || 6 || Latvia<br />
|-<br />
| GLPSD/EULIS || EU/RU/UK || 7 || Liechtenstein<br />
|-<br />
| GLPSD/EULTS || EU/RU/UK || 6 || Lithuania<br />
|-<br />
| GLPSD/EULLS || EU/RU/UK || 6 || Luxembourg<br />
|-<br />
| GLPSD/EUMMS || EU/RU/UK || 6 || Malta<br />
|-<br />
| GLPSD/EUMDS || EU/RU/UK || 6 || Moldova<br />
|-<br />
| GLPSD/EUMNS || EU/RU/UK || 7 || Montenegro<br />
|-<br />
| GLPSD/EUNLS || EU/RU/UK || 6 || Netherlands<br />
|-<br />
| GLPSD/EUNMS || EU/RU/UK || 7 || North Macedonia<br />
|-<br />
| GLPSD/EUNNS || EU/RU/UK || 7 || Norway<br />
|-<br />
| GLPSD/EUPLS || EU/RU/UK || 7 || Poland<br />
|-<br />
| GLPSD/EUPPS || EU/RU/UK || 6 || Portugal<br />
|-<br />
| GLPSD/EUROS || EU/RU/UK || 7 || Romania<br />
|-<br />
| GLPSD/EUSRS || EU/RU/UK || 7 || Serbia<br />
|-<br />
| GLPSD/EUSKS || EU/RU/UK || 7 || Slovakia<br />
|-<br />
| GLPSD/EUSLS || EU/RU/UK || 7 || Slovenia<br />
|-<br />
| GLPSD/EUEES || EU/RU/UK || 7 || Spain<br />
|-<br />
| GLPSD/EUSSS || EU/RU/UK || 6 || Sweden<br />
|-<br />
| GLPSD/EUUAS || EU/RU/UK || 7 || Ukraine<br />
|-<br />
| GLPSD/RURUS || EU/RU/UK || 6 || Russia<br />
|-<br />
| GLPSD/UKUKS || EU/RU/UK || 7 || United Kingdom (Front/Rear)<br />
|-<br />
| GLPSD/UKEUS || EU/RU/UK || 7 || United Kingdom EU (Front/Rear)<br />
|-<br />
| GLPSD/THPCS || Custom || 6 || Thailand - Private Car<br />
|-<br />
| GLPSD/THPVS || Custom || 6 || Thailand - Private Van<br />
|-<br />
| GLPSD/THPPS || Custom || 6 || Thailand - Private 2DR Pickup<br />
|-<br />
| GLPSD/THPTS || Custom || 6 || Thailand - Private Motorized Tricycle<br />
|-<br />
| GLPSD/THTCS || Custom || 6 || Thailand - Taxi<br />
|-<br />
| GLPSD/THSCS || Custom || 6 || Thailand - Service Vehicle<br />
|}<br />
<br />
==Default Fonts==<br />
<br />
Below is a list of default font codes:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Code || Description<br />
|-<br />
| US1 || United States - Generic 1<br />
|-<br />
| US2 || United States - Generic 2<br />
|-<br />
| USCA || United States - California<br />
|-<br />
| USFL || United States - Florida<br />
|-<br />
| USIL || United States - Illinois<br />
|-<br />
| USMA || United States - Massachusetts<br />
|-<br />
| USMD || United States - Maryland<br />
|-<br />
| USMI || United States - Michigan<br />
|-<br />
| USMO || United States - Missouri<br />
|-<br />
| USNC || United States - North Carolina<br />
|-<br />
| USNJ || United States - New Jersey<br />
|-<br />
| USNY || United States - New York<br />
|-<br />
| USOH || United States - Ohio<br />
|-<br />
| USPA || United States - Pennsylvania<br />
|-<br />
| USVA || United States - Virginia<br />
|-<br />
| USWA || United States - Washington<br />
|-<br />
| USWI || United States - Wisconsin<br />
|-<br />
| CAON || Canada - Ontario<br />
|-<br />
| CAQC || Canada - Quebec<br />
|-<br />
| UK || United Kingdom<br />
|-<br />
| EU1 || Europe - Generic 1<br />
|-<br />
| EU2 || Europe - Generic 2<br />
|-<br />
| EU3 || Europe - Generic 3<br />
|-<br />
| JPR || Japan - Romaji/Numerals<br />
|-<br />
| JPH || Japan - Hiragana<br />
|}<br />
<br />
==Changelog==<br />
Rev. 1<br />
* Added ability to change minimum and maximum characters on template.<br />
* Fixed GLPS plate scanning API.<br />
Rev. 0<br />
* Initial public release.</div>NelsonJenkinshttps://wiki.ntbigroup.com/index.php?title=Global_Vehicle_HUD&diff=2954Global Vehicle HUD2021-04-10T20:18:52Z<p>NelsonJenkins: </p>
<hr />
<div>The '''Global Vehicle HUD (GVHUD)''' is a free, open-use HUD provided by the NTBI Group. Anyone can implement GVHUD compatibility into their vehicle and the GVHUD is available for free.<br />
<br />
==Overview==<br />
The GVHUD is a dynamically customizable HUD intended for use by vehicle manufacturers. Manufacturers can use the GVHUD to control different aspects of the vehicle without designing their own HUD.<br />
<br />
The NTBI Group does not maintain a list of compatible vehicles. GVHUD-compatible products should clearly label themselves as such. The NTBI Group does not provide any warranty or support for third-party GVHUD implementations.<br />
<br />
<big>[https://marketplace.secondlife.com/p/Global-Vehicle-HUD-Latest-Version-for-GVHUD-Compatible-Vehicles/20803267 '''Click here''' for the latest version of the GVHUD.]</big><br />
<br />
==End-User Instructions==<br />
Wear the GVHUD by right clicking it in your inventory and selecting "Wear" or "Add". You can also attach it to a different HUD slot (default Top), but you will likely need to reposition it manually.<br />
<br />
You can position the GVHUD as desired in both hidden and shown mode. When hidden or shown, the GVHUD will reposition itself to the position it was last placed in while in that mode.<br />
<br />
The GVHUD layout includes three main sections - a set of per-vehicle customizable buttons, an LCD display with soft buttons, and HIDE and GSTR buttons, which hide the GVHUD and send a folder with gesture keybinds, respectively. The customizable buttons and LCD display layout is different for each vehicle; refer to your vehicle's owner's guide for details.<br />
<br />
==Vehicle Manufacturer Instructions==<br />
Vehicle manufacturers must implement the following API on their own; no support is provided.<br />
<br />
All communication with the GVHUD is done via channel <code>47504750</code>.<br />
<br />
The following commands can be sent from the vehicle to the GVHUD using llRegionSayTo to the avatar's UUID, or the HUD UUID if preferred:<br />
<br />
* '''SYN'''<br />
** Format: <code>SYN</code><br />
** Should be sent by the vehicle when the driver sits. Must only be sent to the driver's avatar UUID, otherwise crosstalk will occur. GVHUD will respond with '''CON'''.<br />
* '''ACK'''<br />
** Format: <code>ACK|[vehicle name]|[array of button ID numbers]|[array of button latch flags]|[array of button states]|[siren main prim UUID]|[siren reverb prim UUID]|[siren name]|[switch state]</code><br />
** Should be sent by the vehicle in response to '''CON'''. Vehicle should also send '''MNU''' immediately after, if desired.<br />
** [vehicle name] is the name of the vehicle to display on the LCD, up to 22 characters.<br />
** [array of button ID numbers] is a comma-separated list of button ID numbers from the table below. The array must be exactly 30 buttons, ordered from 8 left to right at the top (excluding buttons above the LCD), 8 left to right in the center, 8 left to right on the bottom, then 6 left to right above the LCD.<br />
** [array of button latch flags] is a comma-separated list of button latch flags, either 0 for momentary or 1 for latched. The array must be exactly 30 buttons, organized the same as above.<br />
** [array of button states] is a comma-separated list of button states, either 0 for off or 1 for on. The array must be exactly 30 buttons, organized the same as above.<br />
** [siren main prim UUID] and [siren reverb prim UUID] are the prim UUIDs of the siren emitter prims. See below for details.<br />
** [siren name] is the name of the currently installed siren. Possible sirens are: GT6500, GT20A, VR900, BF200, UG4000, SP700, GT4500, MP224, eM, PC9, MP224E, EURO1<br />
** [switch state] is the state of the four-position switch, either 0, 1, 2, or 3.<br />
* '''MNU'''<br />
** Format: <code>MNU|[JSON menu data]</code><br />
** Should be sent by the vehicle immediately after '''ACK''' and can be sent whenever the vehicle wants to set up a new LCD soft button menu tree, if desired.<br />
** [JSON menu data] is a JSON array of menu items, which are JSON objects. Each menu item has the following attributes:<br />
*** "l": label to display for menu item, a string of up to 8 characters, wrapped onto 2 lines of 4 characters each. To skip a menu item on the display, use an empty label ("").<br />
*** "sub" (optional): a JSON array of menu items. If specified, opens a new menu when this menu item is selected.<br />
*** "act" (optional): an action to perform when this menu item is selected. Can be one of the following:<br />
**** "back": Moves back to the previous menu, if a submenu.<br />
**** "help": Opens GVHUD help URL.<br />
** To close the menu, send a blank string ("") for [JSON menu data].<br />
* '''TXT'''<br />
** Format: <code>TXT|[row number]|[text]</code><br />
** Can be sent by the vehicle to render text on the LCD. The GVHUD must have sent '''RFR''' first to signal that the display is ready, otherwise commands will be dropped.<br />
** [row number] is the row number, from 0 to 3, to render text on. If a menu is currently active, using row numbers 2 or 3 will close the menu.<br />
** [text] is the text to render, up to 24 characters.<br />
* '''MSG'''<br />
** Format: <code>MSG|[text]</code><br />
** Can be sent by the vehicle to send a chat message to the HUD wearer.<br />
* '''UPD'''<br />
** Format: <code>UPD|[button index]|[button ID]|[state]</code><br />
** Can be sent by the vehicle to update a button state on the GVHUD. Note that no processing will be performed for this button, so '''BTN''' will not be sent.<br />
** [button index] is the index of the button in the button arrays, 0 to 29. Alternatively, [button index] can be set to -1 to use [button ID] instead.<br />
** [button ID] is the button ID from the table below. Can be used if the vehicle would prefer handling commands via the button ID instead of the button index, but is very slightly slower. If [button index] is not -1, [button ID] is ignored.<br />
** [state] is 0 for off or 1 for on.<br />
* '''SIS'''<br />
** Format: <code>SIS|[siren name]</code><br />
** Can be sent by the vehicle to install a siren outside of '''ACK'''.<br />
** [siren name] is the name of the newly installed siren; see '''ACK''' for a list of possible sirens.<br />
* '''SSS'''<br />
** Format: <code>SSS|[siren state]</code><br />
** Should be sent by the vehicle if another GVHUD sends '''SST''', or if the vehicle has activated a park kill feature.<br />
** [siren state] should be the [siren state] string provided by '''SST'''. [siren state] can also be "off" (without quotes) if the vehicle has a park kill feature.<br />
* '''SVU'''<br />
** Format: <code>SWU|[switch state]</code><br />
** Should be sent by the vehicle if another GVHUD sends '''SWS'''.<br />
** [switch state] should be the [switch state] integer provided by '''SWS'''.<br />
* '''DIS'''<br />
** Format: <code>DIS</code><br />
** Should be sent by the vehicle when the driver unsits.<br />
<br />
The following commands will be sent by the GVHUD to the vehicle using llRegionSayTo to the prim UUID of the object that sent '''ACK''' unless otherwise specified:<br />
<br />
* '''OPT'''<br />
** Format: <code>OPT|[menu label]</code><br />
** Sent by the GVHUD when a menu item is selected. Sent on every selection, including when switching to a submenu.<br />
** [menu label] is the label of the selected menu item.<br />
* '''RFR'''<br />
** Format: <code>RFR</code><br />
** Sent by the GVHUD when it is ready to accept '''TXT''' commands. Vehicle should start sending '''TXT''' commands once it receives '''RFR''' after '''CON'''.<br />
* '''BTN'''<br />
** Format: <code>BTN|[button index]|[button ID]|[state]</code><br />
** Sent by the GVHUD when a button is pressed or released.<br />
** [button index] is the index of the button in the button arrays, 0 to 29.<br />
** [button ID] is the button ID from the table below.<br />
** [state] is 0 for off or 1 for on.<br />
* '''GST'''<br />
** Format: <code>GST|[command]</code><br />
** Sent by the GVHUD when a gesture hotkey is used.<br />
** [command] can be one of the commands described in Gesture Controls below.<br />
* '''SRN'''<br />
** Format: <code>SRN|[sound UUID]</code><br />
** Sent by the GVHUD ''directly to the siren emitter prim specified by '''ACK''' only'' to cause it to play a siren sound.<br />
** [sound UUID] is a sound to play, or NULL_KEY to stop sounds.<br />
* '''SST'''<br />
** Format: <code>SST|[siren state]</code><br />
** Sent by the GVHUD when the siren mode changed. If multiple GVHUDs are attached, the vehicle should send '''SSS''' to the other GVHUD.<br />
** [siren state] is the state of the siren.<br />
* '''SWS'''<br />
** Format: <code>SWS|[switch state]</code><br />
** Sent by the GVHUD when the switch is moved. If multiple GVHUDs are attached, the vehicle should send '''SWU''' to the other GVHUD.<br />
* '''CON'''<br />
** Format: <code>CON</code><br />
** Sent by the GVHUD when it is attached/reset, or in response to '''SYN'''.<br />
<br />
===Siren Interface===<br />
If a siren is used, two prims must be designated as siren sound emitter prims. Their UUIDs should be detected and sent in '''ACK'''.<br />
<br />
To reduce latency, the GVHUD sends '''SRN''' commands directly to the prims designated by '''ACK'''. Each prim must listen for '''SRN''' independently of the script that handles other GVHUD communication, and should play siren sounds as sent by the GVHUD. A sample script is below, which should be placed in each of the prims designated as siren emitter prims:<br />
<br />
default<br />
{<br />
state_entry()<br />
{<br />
llListen(47504750, "", "", "");<br />
}<br />
listen(integer channel, string name, key id, string message)<br />
{<br />
if (llGetSubString(message, 0, 3) == "SRN|" && id == hud_uuid)<br />
{<br />
string uuid = llGetSubString(message, 4, -1);<br />
if (uuid == NULL_KEY) llStopSound();<br />
else llLoopSound(uuid, 1.0);<br />
}<br />
}<br />
}<br />
<br />
Sound emitter scripts must verify that the object that sent the '''SRN''' command is the connected GVHUD. This script snippet does not define <code>hud_uuid</code>; it must be set when the script that controls GVHUD communication sends '''ACK''' so that the emitter knows the UUID of the connected GVHUD.<br />
<br />
===Gesture Controls===<br />
The gestures provided in the GVHUD send the following internal commands:<br />
<br />
* '''F2''': "ZF2", resizes GVHUD.<br />
* '''F3''': "ZF3", toggles axle lock (button ID 28), if equipped, otherwise ignored.<br />
* '''F4''': "ZF4", cycles through hands-free siren tones, if eqipped, otherwise ignored.<br />
* '''F5''': "ZF5", moves switch to position 0.<br />
* '''F6''': "ZF6", moves switch to position 1.<br />
* '''F7''': "ZF7", moves switch to position 2.<br />
* '''F8''': "ZF8", moves switch to position 3.<br />
* '''Ctrl + Left''': "ZCA", toggles turn L (button ID 24), if equipped, otherwise ignored.<br />
* '''Ctrl + Right''': "ZCD", toggles turn L (button ID 29), if equipped, otherwise ignored.<br />
* '''Ctrl + Down''': "ZCS", toggles hazards (button ID 25), if equipped, otherwise ignored.<br />
* '''H''': "ZZH", horn tap, sends <code>GST|HORN</code>.<br />
* '''L''': "ZZL", toggles cycle headlights (button ID 26), if equipped, otherwise ignored.<br />
* '''K''': "ZZK", high beams flash, sends <code>GST|BRIGHT</code>.<br />
* '''I''': "ZZI", toggles key (button ID 7), if equipped, otherwise ignored.<br />
* '''O''': "ZZO", get out, sends <code>GST|OUT</code>.<br />
* '''Space''': "ZZ_", handbrake, sends <code>GST|BRAKE</code>.<br />
* '''1''': "ZZ1", camera 1, sends <code>GST|CAM1</code>.<br />
* '''2''': "ZZ2", camera 2, sends <code>GST|CAM2</code>.<br />
* '''3''': "ZZ3", camera 3, sends <code>GST|CAM3</code>.<br />
* '''4''': "ZZ4", camera 4, sends <code>GST|CAM4</code>.<br />
* '''5''': "ZZ5", camera 5, sends <code>GST|CAM5</code>.<br />
* '''6''': "ZZ6", camera 6, sends <code>GST|CAM6</code>.<br />
<br />
===Button IDs===<br />
The following is a list of available button IDs.<br />
<br />
This list can be expanded by the NTBI Group without a GVHUD update. If you have a button label you would like to be integrated into the GVHUD's available buttons, contact Nelson Jenkins.<br />
<br />
{| class="wikitable"<br />
|-<br />
! ID || Description || ID || Description || ID || Description || ID || Description<br />
|-<br />
| -10 || Siren Wail* || -11 || Siren Yelp* || -12 || Siren Priority* || -13 || Siren Manual*<br />
|-<br />
| -14 || Siren Horn* || -1 || Blank || || || || <br />
|-<br />
| 0 || LIGHT BAR (Red) || 1 || STRB (Red) || 2 || TKDN FLASH (Red) || 3 || TAKE DOWN (Red)<br />
|-<br />
| 4 || FLOOD (Red) || 5 || CRZ (Red) || 6 || (Reserved) || 7 || Key (Green)<br />
|-<br />
| 8 || HIDE AWAY (Red) || 9 || WIG WAG (Red) || 10 || Arrow (Red) || 11 || Siren Wail*<br />
|-<br />
| 12 || Siren Yelp* || 13 || Siren Priority* || 14 || Siren Manual* || 15 || Siren Horn*<br />
|-<br />
| 16 || AUX 1 || 17 || AUX 2 || 18 || AUX 3 || 19 || CUT F (Red)<br />
|-<br />
| 20 || CUT R (Red) || 21 || (Reserved) || 22 || (Reserved) || 23 || (Reserved)<br />
|-<br />
| 24 || Turn Sig L || 25 || Cycle Headlights || 26 || Hazard Flashers || 27 || Horn<br />
|-<br />
| 28 || Axle Lock || 29 || Turn Sig R || || || || <br />
|}<br />
<br />
<nowiki>*</nowiki> Use negative button IDs for GVHUD to handle the siren. The GVHUD will automatically pick the correct buttons to show, will only allow one on at a time, and will send siren commands directly to the prims specified in SSU. Use positive button IDs for sirens only if you want them to send BTN commands and not be connected together.<br />
<br />
==Changelog==<br />
Rev. 1<br />
* Fixed GVHUD gestures not working.<br />
* Fixed GVHUD losing its saved position/scale data and resetting when attached.<br />
Rev. 0<br />
* Initial public release.</div>NelsonJenkinshttps://wiki.ntbigroup.com/index.php?title=Global_Mod_Link_System&diff=2953Global Mod Link System2021-04-10T20:17:56Z<p>NelsonJenkins: </p>
<hr />
<div>The '''Global Mod Link System (GMLS)''' is a free, full-permission script system provided by the NTBI Group. Anyone can implement GMLS into their modifiable vehicle, and anyone can build mods that automatically position themselves when linked to a GMLS-compatible vehicle.<br />
<br />
==Overview==<br />
GMLS is a set of full-permissions scripts. It is intended for use in modifiable vehicles to simplify the installation of prebuilt modifications. For example, the NTBI Factory Lightbar Package uses GMLS to automatically position lightbars when linked to compatible vehicles.<br />
<br />
Aftermarket modification manufacturers can set up GMLS by linking a copy of the modification to the desired vehicle and using the Calibration Tool to set up the Alignment Tool. Then, when an end-user links the modification to a compatible vehicle, the modification will reposition itself (and, if necessary, rescale itself) automatically. GMLS can also unlink certain prims from the vehicle for factory prim replacements.<br />
<br />
GMLS comes with three scripts:<br />
<br />
* '''NTBI GMLS Alignment Tool''' - Inserted into aftermarket modifications and edited by the modification manufacturer to program alignment positions and other options.<br />
* '''NTBI GMLS Calibration Tool''' - Used to calibrate alignment positions; outputs alignment data to be placed in the Alignment Tool.<br />
* '''NTBI GMLS Vehicle Sample Script''' - Inserted into vehicles and edited by the vehicle manufacturer to define vehicle information for use by modifications.<br />
<br />
The NTBI Group does not maintain a list of compatible vehicles or modifications. GMLS-compatible products should clearly label themselves as such. The NTBI Group does not provide any warranty for third-party GMLS implementations.<br />
<br />
<big>[https://marketplace.secondlife.com/p/GMLS-Development-Kit-Tools-for-Integrating-the-Global-Mod-Link-System/20803262 '''Click here''' for the GMLS developer kit.]</big><br />
<br />
==End-User Instructions==<br />
Refer to your vehicle's owner's guide for instructions on how to install GMLS-compatible equipment.<br />
<br />
If the owner's guide does not provide instructions, the following is a general checklist for installing GMLS-compatible modifications:<br />
<br />
# Ensure that the vehicle is turned off, including any lighting or other components that may change any attributes while installing the modification.<br />
# Take a copy of your vehicle as-is. Modifications may cause damage or unlink prims accidentally. Save a copy now in case this happens!<br />
# Rez the modification near your vehicle.<br />
# Right click the modification and select "Edit".<br />
# With the Edit window open, hold your SHIFT key and left click the vehicle. This should select both objects at once. Make sure you select the vehicle last.<br />
# Press your CTRL + L keys, or click the "Link" button in the Edit window.<br />
# If prompted, confirm that you want to link the two objects together.<br />
# When linked, the modification should automatically position itself to the recommended position and resize if necessary.<br />
# If prompted, grant link permissions. This may unlink some prims. Make sure to delete them after.<br />
# If desired, you may usually move the equipment once linked.<br />
<br />
If a modification does not use GMLS, is not compatible with your vehicle's GMLS system, or returns an error when linking using the above procedure, follow steps 1 through 6, then manually reposition the modification as needed.<br />
<br />
==Aftermarket Modification Manufacturer Instructions==<br />
Get the Alignment Tool and Calibration Tool from the [https://marketplace.secondlife.com/p/GMLS-Development-Kit-Tools-for-Integrating-the-Global-Mod-Link-System/20803262 GMLS developer kit.]<br />
<br />
Before continuing, make sure your mod is finished. Do not continue until you are sure you do not need to make any changes to your object.<br />
<br />
# Make a two copies of your object. One will be used for calibration. The other will be distributed to your end-users.<br />
# Place the "NTBI GMLS Alignment Tool" script in the distribution object (the one you will keep).<br />
# Place the "NTBI GMLS Calibration Tool" script in the calibration object (the one you will link, then delete).<br />
<br />
For each vehicle you want your object to be compatible with:<br />
<br />
# Make a new copy of the calibration object. It should have the "NTBI GMLS Calibration Tool" script already in it.<br />
# Rez the vehicle. Make sure it is the original size!<br />
# Position the calibration object on the vehicle, exactly where you want it to be once installed by the end-user.<br />
# Link the calibration object to the vehicle.<br />
# Copy the script snippet line sent to local chat.<br />
# Open the "NTBI GMLS Alignment Tool" script in the distribution object.<br />
# Paste the script snippet line between the two marked lines at the top of the script. NOTE: The first part of each line is the GMLS ID of the vehicle you have calibrated to. If you see a line with the same GMLS ID, you have already calibrated to that vehicle, and only the first instance of that vehicle will be used.<br />
# Save the "NTBI GMLS Alignment Tool" script.<br />
<br />
Once finished, delete any calibration objects and vehicles.<br />
<br />
If you want the root prim of the object to retain its physics type when linked to the vehicle, change root_no_physics to FALSE. (By default, the root prim of this object will be set to physics type "none" and the physics types of child prims will remain the same.)<br />
<br />
If you want to have the GMLS script automatically unlink prims, list their names in the remove_prims list. If you do this, you can also change remove_move_dist to change the distance unlinked prims will move up, and you can change remove_recolor to FALSE if you do not want unlinked prims to be recolored bright red for visibility.<br />
<br />
When finished, make sure you test your modification on each compatible vehicle to make sure it works correctly.<br />
<br />
===API===<br />
The Alignment Tool and vehicle script send the following link messages that can be used to trigger additional scripts in your modification:<br />
<br />
* <code>GMLS_REQUEST</code><br />
** Sent by Alignment Tool once linked. Vehicle responds with <code>GMLS_ID</code> if compatible. You can also send this manually once the GMLS script is finished if you need any information from <code>GMLS_ID</code>.<br />
* <code>GMLS_ID</code><br />
** '''Key''': [gmls_id]|[root scale]|[additional information]<br />
** Sent by vehicle in response to <code>GMLS_REQUEST</code>. Note that [root scale] is not the ''size'' of the root prim of the vehicle, but rather the ratio of the current size of the root to the original size of the root. For example, [root scale] on a vehicle that was upsized to twice its original size would be <2.0, 2.0, 2.0> regardless of its actual size.<br />
* <code>GMLS_SUCCESS</code><br />
** Sent by Alignment Tool if the GMLS operation completed successfully and it is now safe to perform any configuration changes or whatever else on the newly linked-to vehicle.<br />
* <code>GMLS_FAIL</code><br />
** Sent by Alignment Tool if the GMLS operation failed either because the object the modification was just linked to is not GMLS-compatible or the vehicle has a gmls_id that the modification was not calibrated for.<br />
* <code>GMLS_CANCEL</code><br />
** Sent by Alignment Tool if the GMLS operation was cancelled by the user.<br />
<br />
==Vehicle Manufacturer Instructions==<br />
Get the Alignment Tool and Calibration Tool from the [https://marketplace.secondlife.com/p/GMLS-Development-Kit-Tools-for-Integrating-the-Global-Mod-Link-System/20803262 GMLS developer kit.]<br />
<br />
Before continuing, make sure your vehicle's root prim will not be resized before it is distributed. Do not continue until the root prim is finalized.<br />
<br />
# Place the "NTBI GMLS Vehicle Sample Script" script in the vehicle. If you prefer, you can also integrate this script into another script in the vehicle to save memory.<br />
# Edit the gmls_id string. You can use any string as long as it does not include the pipe ("|") character, but it should be limited to alphanumeric characters, underscores ("_"), and be up to 32 characters. The gmls_id must be unique for every vehicle that has a different layout of potential modification positions. For example, use different IDs for 2DR and 4DR variations of the same vehicle.<br />
# Edit the gmls_default_root_size vector to be the size of the root prim of the vehicle. On most viewers, you can get this value by opening the Edit window, going to the Object tab, and pushing the "C" button next to Size. WARNING: This is not optional. Failure to set this value will cause GMLS modifications to align improperly.<br />
# Save the "NTBI GMLS Vehicle Sample Script" script. If kept separate, you can [http://wiki.secondlife.com/wiki/LlSetMemoryLimit limit the memory used by the script] if you prefer.<br />
<br />
Perform this procedure for each vehicle variation. Once finished, it is a good idea to test the GMLS settings by creating a simple object and following the Aftermarket Modification Manufacturer Instructions.<br />
<br />
==Changelog==<br />
Rev. 1<br />
* Added GMLS_SUCCESS, GMLS_FAIL, and GMLS_CANCEL link messages.<br />
* Fixed erroring out and refusing to reposition if linked before permissions have been granted.<br />
* Fixed unlinking parts check running before checking if vehicle is compatible in the first place.<br />
* Fixed crosstalk when multiple GMLS modifications are rezzed at once.<br />
* Improved vehicle detection in slow regions by extending identification time from 2 seconds to 5 seconds.<br />
Rev. 0<br />
* Initial public release.</div>NelsonJenkinshttps://wiki.ntbigroup.com/index.php?title=Global_Mod_Link_System&diff=2952Global Mod Link System2021-04-10T20:15:30Z<p>NelsonJenkins: </p>
<hr />
<div>The '''Global Mod Link System (GMLS)''' is a free, full-permission script system provided by the NTBI Group. Anyone can implement GMLS into their modifiable vehicle, and anyone can build mods that automatically position themselves when linked to a GMLS-compatible vehicle.<br />
<br />
==Overview==<br />
GMLS is a set of full-permissions scripts. It is intended for use in modifiable vehicles to simplify the installation of prebuilt modifications. For example, the NTBI Factory Lightbar Package uses GMLS to automatically position lightbars when linked to compatible vehicles.<br />
<br />
Aftermarket modification manufacturers can set up GMLS by linking a copy of the modification to the desired vehicle and using the Calibration Tool to set up the Alignment Tool. Then, when an end-user links the modification to a compatible vehicle, the modification will reposition itself (and, if necessary, rescale itself) automatically. GMLS can also unlink certain prims from the vehicle for factory prim replacements.<br />
<br />
GMLS comes with three scripts:<br />
<br />
* '''NTBI GMLS Alignment Tool''' - Inserted into aftermarket modifications and edited by the modification manufacturer to program alignment positions and other options.<br />
* '''NTBI GMLS Calibration Tool''' - Used to calibrate alignment positions; outputs alignment data to be placed in the Alignment Tool.<br />
* '''NTBI GMLS Vehicle Sample Script''' - Inserted into vehicles and edited by the vehicle manufacturer to define vehicle information for use by modifications.<br />
<br />
The NTBI Group does not maintain a list of compatible vehicles or modifications. GMLS-compatible products should clearly label themselves as such. The NTBI Group does not provide any warranty for third-party GMLS implementations.<br />
<br />
<big>[https://marketplace.secondlife.com/p/GMLS-Development-Kit-Tools-for-Integrating-the-Global-Mod-Link-System/20803262 '''Click here''' for the GMLS developer kit.]</big><br />
<br />
==End-User Instructions==<br />
Refer to your vehicle's owner's guide for instructions on how to install GMLS-compatible equipment.<br />
<br />
If the owner's guide does not provide instructions, the following is a general checklist for installing GMLS-compatible modifications:<br />
<br />
# Ensure that the vehicle is turned off, including any lighting or other components that may change any attributes while installing the modification.<br />
# Take a copy of your vehicle as-is. Modifications may cause damage or unlink prims accidentally. Save a copy now in case this happens!<br />
# Rez the modification near your vehicle.<br />
# Right click the modification and select "Edit".<br />
# With the Edit window open, hold your SHIFT key and left click the vehicle. This should select both objects at once. Make sure you select the vehicle last.<br />
# Press your CTRL + L keys, or click the "Link" button in the Edit window.<br />
# If prompted, confirm that you want to link the two objects together.<br />
# When linked, the modification should automatically position itself to the recommended position and resize if necessary.<br />
# If prompted, grant link permissions. This may unlink some prims. Make sure to delete them after.<br />
# If desired, you may usually move the equipment once linked.<br />
<br />
If a modification does not use GMLS, is not compatible with your vehicle's GMLS system, or returns an error when linking using the above procedure, follow steps 1 through 6, then manually reposition the modification as needed.<br />
<br />
==Aftermarket Modification Manufacturer Instructions==<br />
Get the Alignment Tool and Calibration Tool from the [https://marketplace.secondlife.com/p/GMLS-Development-Kit-Tools-for-Integrating-the-Global-Mod-Link-System/20803262 GMLS developer kit.]<br />
<br />
Before continuing, make sure your mod is finished. Do not continue until you are sure you do not need to make any changes to your object.<br />
<br />
# Make a two copies of your object. One will be used for calibration. The other will be distributed to your end-users.<br />
# Place the "NTBI GMLS Alignment Tool" script in the distribution object (the one you will keep).<br />
# Place the "NTBI GMLS Calibration Tool" script in the calibration object (the one you will link, then delete).<br />
<br />
For each vehicle you want your object to be compatible with:<br />
<br />
# Make a new copy of the calibration object. It should have the "NTBI GMLS Calibration Tool" script already in it.<br />
# Rez the vehicle. Make sure it is the original size!<br />
# Position the calibration object on the vehicle, exactly where you want it to be once installed by the end-user.<br />
# Link the calibration object to the vehicle.<br />
# Copy the script snippet line sent to local chat.<br />
# Open the "NTBI GMLS Alignment Tool" script in the distribution object.<br />
# Paste the script snippet line between the two marked lines at the top of the script. NOTE: The first part of each line is the GMLS ID of the vehicle you have calibrated to. If you see a line with the same GMLS ID, you have already calibrated to that vehicle, and only the first instance of that vehicle will be used.<br />
# Save the "NTBI GMLS Alignment Tool" script.<br />
<br />
Once finished, delete any calibration objects and vehicles.<br />
<br />
If you want the root prim of the object to retain its physics type when linked to the vehicle, change root_no_physics to FALSE. (By default, the root prim of this object will be set to physics type "none" and the physics types of child prims will remain the same.)<br />
<br />
If you want to have the GMLS script automatically unlink prims, list their names in the remove_prims list. If you do this, you can also change remove_move_dist to change the distance unlinked prims will move up, and you can change remove_recolor to FALSE if you do not want unlinked prims to be recolored bright red for visibility.<br />
<br />
When finished, make sure you test your modification on each compatible vehicle to make sure it works correctly.<br />
<br />
===API===<br />
The Alignment Tool and vehicle script send the following link messages that can be used to trigger additional scripts in your modification:<br />
<br />
* <code>GMLS_REQUEST</code><br />
** Sent by Alignment Tool once linked. Vehicle responds with <code>GMLS_ID</code> if compatible. You can also send this manually once the GMLS script is finished if you need any information from <code>GMLS_ID</code>.<br />
* <code>GMLS_ID</code><br />
** '''Key''': [gmls_id]|[root scale]|[additional information]<br />
** Sent by vehicle in response to <code>GMLS_REQUEST</code>. Note that [root scale] is not the ''size'' of the root prim of the vehicle, but rather the ratio of the current size of the root to the original size of the root. For example, [root scale] on a vehicle that was upsized to twice its original size would be <2.0, 2.0, 2.0> regardless of its actual size.<br />
* <code>GMLS_SUCCESS</code><br />
** Sent by Alignment Tool if the GMLS operation completed successfully and it is now safe to perform any configuration changes or whatever else on the newly linked-to vehicle.<br />
* <code>GMLS_FAIL</code><br />
** Sent by Alignment Tool if the GMLS operation failed either because the object the modification was just linked to is not GMLS-compatible or the vehicle has a gmls_id that the modification was not calibrated for.<br />
* <code>GMLS_CANCEL</code><br />
** Sent by Alignment Tool if the GMLS operation was cancelled by the user.<br />
<br />
==Vehicle Manufacturer Instructions==<br />
Get the Alignment Tool and Calibration Tool from the [https://marketplace.secondlife.com/p/GMLS-Development-Kit-Tools-for-Integrating-the-Global-Mod-Link-System/20803262 GMLS developer kit.]<br />
<br />
Before continuing, make sure your vehicle's root prim will not be resized before it is distributed. Do not continue until the root prim is finalized.<br />
<br />
# Place the "NTBI GMLS Vehicle Sample Script" script in the vehicle. If you prefer, you can also integrate this script into another script in the vehicle to save memory.<br />
# Edit the gmls_id string. You can use any string as long as it does not include the pipe ("|") character, but it should be limited to alphanumeric characters, underscores ("_"), and be up to 32 characters. The gmls_id must be unique for every vehicle that has a different layout of potential modification positions. For example, use different IDs for 2DR and 4DR variations of the same vehicle.<br />
# Edit the gmls_default_root_size vector to be the size of the root prim of the vehicle. On most viewers, you can get this value by opening the Edit window, going to the Object tab, and pushing the "C" button next to Size. WARNING: This is not optional. Failure to set this value will cause GMLS modifications to align improperly.<br />
# Save the "NTBI GMLS Vehicle Sample Script" script. If kept separate, you can [http://wiki.secondlife.com/wiki/LlSetMemoryLimit limit the memory used by the script] if you prefer.<br />
<br />
Perform this procedure for each vehicle variation. Once finished, it is a good idea to test the GMLS settings by creating a simple object and following the Aftermarket Modification Manufacturer Instructions.</div>NelsonJenkinshttps://wiki.ntbigroup.com/index.php?title=Global_Vehicle_HUD&diff=2951Global Vehicle HUD2021-04-10T20:03:33Z<p>NelsonJenkins: /* Siren Interface */</p>
<hr />
<div>The '''Global Vehicle HUD (GVHUD)''' is a free, open-use HUD provided by the NTBI Group. Anyone can implement GVHUD compatibility into their vehicle and the GVHUD is available for free.<br />
<br />
==Overview==<br />
The GVHUD is a dynamically customizable HUD intended for use by vehicle manufacturers. Manufacturers can use the GVHUD to control different aspects of the vehicle without designing their own HUD.<br />
<br />
The NTBI Group does not maintain a list of compatible vehicles. GVHUD-compatible products should clearly label themselves as such. The NTBI Group does not provide any warranty or support for third-party GVHUD implementations.<br />
<br />
<big>[https://marketplace.secondlife.com/p/Global-Vehicle-HUD-Latest-Version-for-GVHUD-Compatible-Vehicles/20803267 '''Click here''' for the latest version of the GVHUD.]</big><br />
<br />
==End-User Instructions==<br />
Wear the GVHUD by right clicking it in your inventory and selecting "Wear" or "Add". You can also attach it to a different HUD slot (default Top), but you will likely need to reposition it manually.<br />
<br />
You can position the GVHUD as desired in both hidden and shown mode. When hidden or shown, the GVHUD will reposition itself to the position it was last placed in while in that mode.<br />
<br />
The GVHUD layout includes three main sections - a set of per-vehicle customizable buttons, an LCD display with soft buttons, and HIDE and GSTR buttons, which hide the GVHUD and send a folder with gesture keybinds, respectively. The customizable buttons and LCD display layout is different for each vehicle; refer to your vehicle's owner's guide for details.<br />
<br />
==Vehicle Manufacturer Instructions==<br />
Vehicle manufacturers must implement the following API on their own; no support is provided.<br />
<br />
All communication with the GVHUD is done via channel <code>47504750</code>.<br />
<br />
The following commands can be sent from the vehicle to the GVHUD using llRegionSayTo to the avatar's UUID, or the HUD UUID if preferred:<br />
<br />
* '''SYN'''<br />
** Format: <code>SYN</code><br />
** Should be sent by the vehicle when the driver sits. Must only be sent to the driver's avatar UUID, otherwise crosstalk will occur. GVHUD will respond with '''CON'''.<br />
* '''ACK'''<br />
** Format: <code>ACK|[vehicle name]|[array of button ID numbers]|[array of button latch flags]|[array of button states]|[siren main prim UUID]|[siren reverb prim UUID]|[siren name]|[switch state]</code><br />
** Should be sent by the vehicle in response to '''CON'''. Vehicle should also send '''MNU''' immediately after, if desired.<br />
** [vehicle name] is the name of the vehicle to display on the LCD, up to 22 characters.<br />
** [array of button ID numbers] is a comma-separated list of button ID numbers from the table below. The array must be exactly 30 buttons, ordered from 8 left to right at the top (excluding buttons above the LCD), 8 left to right in the center, 8 left to right on the bottom, then 6 left to right above the LCD.<br />
** [array of button latch flags] is a comma-separated list of button latch flags, either 0 for momentary or 1 for latched. The array must be exactly 30 buttons, organized the same as above.<br />
** [array of button states] is a comma-separated list of button states, either 0 for off or 1 for on. The array must be exactly 30 buttons, organized the same as above.<br />
** [siren main prim UUID] and [siren reverb prim UUID] are the prim UUIDs of the siren emitter prims. See below for details.<br />
** [siren name] is the name of the currently installed siren. Possible sirens are: GT6500, GT20A, VR900, BF200, UG4000, SP700, GT4500, MP224, eM, PC9, MP224E, EURO1<br />
** [switch state] is the state of the four-position switch, either 0, 1, 2, or 3.<br />
* '''MNU'''<br />
** Format: <code>MNU|[JSON menu data]</code><br />
** Should be sent by the vehicle immediately after '''ACK''' and can be sent whenever the vehicle wants to set up a new LCD soft button menu tree, if desired.<br />
** [JSON menu data] is a JSON array of menu items, which are JSON objects. Each menu item has the following attributes:<br />
*** "l": label to display for menu item, a string of up to 8 characters, wrapped onto 2 lines of 4 characters each. To skip a menu item on the display, use an empty label ("").<br />
*** "sub" (optional): a JSON array of menu items. If specified, opens a new menu when this menu item is selected.<br />
*** "act" (optional): an action to perform when this menu item is selected. Can be one of the following:<br />
**** "back": Moves back to the previous menu, if a submenu.<br />
**** "help": Opens GVHUD help URL.<br />
** To close the menu, send a blank string ("") for [JSON menu data].<br />
* '''TXT'''<br />
** Format: <code>TXT|[row number]|[text]</code><br />
** Can be sent by the vehicle to render text on the LCD. The GVHUD must have sent '''RFR''' first to signal that the display is ready, otherwise commands will be dropped.<br />
** [row number] is the row number, from 0 to 3, to render text on. If a menu is currently active, using row numbers 2 or 3 will close the menu.<br />
** [text] is the text to render, up to 24 characters.<br />
* '''MSG'''<br />
** Format: <code>MSG|[text]</code><br />
** Can be sent by the vehicle to send a chat message to the HUD wearer.<br />
* '''UPD'''<br />
** Format: <code>UPD|[button index]|[button ID]|[state]</code><br />
** Can be sent by the vehicle to update a button state on the GVHUD. Note that no processing will be performed for this button, so '''BTN''' will not be sent.<br />
** [button index] is the index of the button in the button arrays, 0 to 29. Alternatively, [button index] can be set to -1 to use [button ID] instead.<br />
** [button ID] is the button ID from the table below. Can be used if the vehicle would prefer handling commands via the button ID instead of the button index, but is very slightly slower. If [button index] is not -1, [button ID] is ignored.<br />
** [state] is 0 for off or 1 for on.<br />
* '''SIS'''<br />
** Format: <code>SIS|[siren name]</code><br />
** Can be sent by the vehicle to install a siren outside of '''ACK'''.<br />
** [siren name] is the name of the newly installed siren; see '''ACK''' for a list of possible sirens.<br />
* '''SSS'''<br />
** Format: <code>SSS|[siren state]</code><br />
** Should be sent by the vehicle if another GVHUD sends '''SST''', or if the vehicle has activated a park kill feature.<br />
** [siren state] should be the [siren state] string provided by '''SST'''. [siren state] can also be "off" (without quotes) if the vehicle has a park kill feature.<br />
* '''SVU'''<br />
** Format: <code>SWU|[switch state]</code><br />
** Should be sent by the vehicle if another GVHUD sends '''SWS'''.<br />
** [switch state] should be the [switch state] integer provided by '''SWS'''.<br />
* '''DIS'''<br />
** Format: <code>DIS</code><br />
** Should be sent by the vehicle when the driver unsits.<br />
<br />
The following commands will be sent by the GVHUD to the vehicle using llRegionSayTo to the prim UUID of the object that sent '''ACK''' unless otherwise specified:<br />
<br />
* '''OPT'''<br />
** Format: <code>OPT|[menu label]</code><br />
** Sent by the GVHUD when a menu item is selected. Sent on every selection, including when switching to a submenu.<br />
** [menu label] is the label of the selected menu item.<br />
* '''RFR'''<br />
** Format: <code>RFR</code><br />
** Sent by the GVHUD when it is ready to accept '''TXT''' commands. Vehicle should start sending '''TXT''' commands once it receives '''RFR''' after '''CON'''.<br />
* '''BTN'''<br />
** Format: <code>BTN|[button index]|[button ID]|[state]</code><br />
** Sent by the GVHUD when a button is pressed or released.<br />
** [button index] is the index of the button in the button arrays, 0 to 29.<br />
** [button ID] is the button ID from the table below.<br />
** [state] is 0 for off or 1 for on.<br />
* '''GST'''<br />
** Format: <code>GST|[command]</code><br />
** Sent by the GVHUD when a gesture hotkey is used.<br />
** [command] can be one of the commands described in Gesture Controls below.<br />
* '''SRN'''<br />
** Format: <code>SRN|[sound UUID]</code><br />
** Sent by the GVHUD ''directly to the siren emitter prim specified by '''ACK''' only'' to cause it to play a siren sound.<br />
** [sound UUID] is a sound to play, or NULL_KEY to stop sounds.<br />
* '''SST'''<br />
** Format: <code>SST|[siren state]</code><br />
** Sent by the GVHUD when the siren mode changed. If multiple GVHUDs are attached, the vehicle should send '''SSS''' to the other GVHUD.<br />
** [siren state] is the state of the siren.<br />
* '''SWS'''<br />
** Format: <code>SWS|[switch state]</code><br />
** Sent by the GVHUD when the switch is moved. If multiple GVHUDs are attached, the vehicle should send '''SWU''' to the other GVHUD.<br />
* '''CON'''<br />
** Format: <code>CON</code><br />
** Sent by the GVHUD when it is attached/reset, or in response to '''SYN'''.<br />
<br />
===Siren Interface===<br />
If a siren is used, two prims must be designated as siren sound emitter prims. Their UUIDs should be detected and sent in '''ACK'''.<br />
<br />
To reduce latency, the GVHUD sends '''SRN''' commands directly to the prims designated by '''ACK'''. Each prim must listen for '''SRN''' independently of the script that handles other GVHUD communication, and should play siren sounds as sent by the GVHUD. A sample script is below, which should be placed in each of the prims designated as siren emitter prims:<br />
<br />
default<br />
{<br />
state_entry()<br />
{<br />
llListen(47504750, "", "", "");<br />
}<br />
listen(integer channel, string name, key id, string message)<br />
{<br />
if (llGetSubString(message, 0, 3) == "SRN|" && id == hud_uuid)<br />
{<br />
string uuid = llGetSubString(message, 4, -1);<br />
if (uuid == NULL_KEY) llStopSound();<br />
else llLoopSound(uuid, 1.0);<br />
}<br />
}<br />
}<br />
<br />
Sound emitter scripts must verify that the object that sent the '''SRN''' command is the connected GVHUD. This script snippet does not define <code>hud_uuid</code>; it must be set when the script that controls GVHUD communication sends '''ACK''' so that the emitter knows the UUID of the connected GVHUD.<br />
<br />
===Gesture Controls===<br />
The gestures provided in the GVHUD send the following internal commands:<br />
<br />
* '''F2''': "ZF2", resizes GVHUD.<br />
* '''F3''': "ZF3", toggles axle lock (button ID 28), if equipped, otherwise ignored.<br />
* '''F4''': "ZF4", cycles through hands-free siren tones, if eqipped, otherwise ignored.<br />
* '''F5''': "ZF5", moves switch to position 0.<br />
* '''F6''': "ZF6", moves switch to position 1.<br />
* '''F7''': "ZF7", moves switch to position 2.<br />
* '''F8''': "ZF8", moves switch to position 3.<br />
* '''Ctrl + Left''': "ZCA", toggles turn L (button ID 24), if equipped, otherwise ignored.<br />
* '''Ctrl + Right''': "ZCD", toggles turn L (button ID 29), if equipped, otherwise ignored.<br />
* '''Ctrl + Down''': "ZCS", toggles hazards (button ID 25), if equipped, otherwise ignored.<br />
* '''H''': "ZZH", horn tap, sends <code>GST|HORN</code>.<br />
* '''L''': "ZZL", toggles cycle headlights (button ID 26), if equipped, otherwise ignored.<br />
* '''K''': "ZZK", high beams flash, sends <code>GST|BRIGHT</code>.<br />
* '''I''': "ZZI", toggles key (button ID 7), if equipped, otherwise ignored.<br />
* '''O''': "ZZO", get out, sends <code>GST|OUT</code>.<br />
* '''Space''': "ZZ_", handbrake, sends <code>GST|BRAKE</code>.<br />
* '''1''': "ZZ1", camera 1, sends <code>GST|CAM1</code>.<br />
* '''2''': "ZZ2", camera 2, sends <code>GST|CAM2</code>.<br />
* '''3''': "ZZ3", camera 3, sends <code>GST|CAM3</code>.<br />
* '''4''': "ZZ4", camera 4, sends <code>GST|CAM4</code>.<br />
* '''5''': "ZZ5", camera 5, sends <code>GST|CAM5</code>.<br />
* '''6''': "ZZ6", camera 6, sends <code>GST|CAM6</code>.<br />
<br />
===Button IDs===<br />
The following is a list of available button IDs.<br />
<br />
This list can be expanded by the NTBI Group without a GVHUD update. If you have a button label you would like to be integrated into the GVHUD's available buttons, contact Nelson Jenkins.<br />
<br />
{| class="wikitable"<br />
|-<br />
! ID || Description || ID || Description || ID || Description || ID || Description<br />
|-<br />
| -10 || Siren Wail* || -11 || Siren Yelp* || -12 || Siren Priority* || -13 || Siren Manual*<br />
|-<br />
| -14 || Siren Horn* || -1 || Blank || || || || <br />
|-<br />
| 0 || LIGHT BAR (Red) || 1 || STRB (Red) || 2 || TKDN FLASH (Red) || 3 || TAKE DOWN (Red)<br />
|-<br />
| 4 || FLOOD (Red) || 5 || CRZ (Red) || 6 || (Reserved) || 7 || Key (Green)<br />
|-<br />
| 8 || HIDE AWAY (Red) || 9 || WIG WAG (Red) || 10 || Arrow (Red) || 11 || Siren Wail*<br />
|-<br />
| 12 || Siren Yelp* || 13 || Siren Priority* || 14 || Siren Manual* || 15 || Siren Horn*<br />
|-<br />
| 16 || AUX 1 || 17 || AUX 2 || 18 || AUX 3 || 19 || CUT F (Red)<br />
|-<br />
| 20 || CUT R (Red) || 21 || (Reserved) || 22 || (Reserved) || 23 || (Reserved)<br />
|-<br />
| 24 || Turn Sig L || 25 || Cycle Headlights || 26 || Hazard Flashers || 27 || Horn<br />
|-<br />
| 28 || Axle Lock || 29 || Turn Sig R || || || || <br />
|}<br />
<br />
<nowiki>*</nowiki> Use negative button IDs for GVHUD to handle the siren. The GVHUD will automatically pick the correct buttons to show, will only allow one on at a time, and will send siren commands directly to the prims specified in SSU. Use positive button IDs for sirens only if you want them to send BTN commands and not be connected together.</div>NelsonJenkinshttps://wiki.ntbigroup.com/index.php?title=GVHUD&diff=2950GVHUD2021-04-10T20:02:42Z<p>NelsonJenkins: Redirected page to Global Vehicle HUD</p>
<hr />
<div>#REDIRECT [[Global Vehicle HUD]]</div>NelsonJenkinshttps://wiki.ntbigroup.com/index.php?title=GFS&diff=2949GFS2021-04-10T20:02:25Z<p>NelsonJenkins: Redirected page to Global Fuel System</p>
<hr />
<div>#REDIRECT [[Global Fuel System]]</div>NelsonJenkinshttps://wiki.ntbigroup.com/index.php?title=GLPS&diff=2948GLPS2021-04-10T20:02:03Z<p>NelsonJenkins: Redirected page to Global License Plate System</p>
<hr />
<div>#REDIRECT [[Global License Plate System]]</div>NelsonJenkinshttps://wiki.ntbigroup.com/index.php?title=GMLS&diff=2947GMLS2021-04-10T20:01:43Z<p>NelsonJenkins: Redirected page to Global Mod Link System</p>
<hr />
<div>#REDIRECT [[Global Mod Link System]]</div>NelsonJenkinshttps://wiki.ntbigroup.com/index.php?title=Global_License_Plate_System&diff=2946Global License Plate System2021-04-05T18:35:01Z<p>NelsonJenkins: /* For Roleplay Managers and Other Developers */</p>
<hr />
<div>The '''Global License Plate System (GLPS)''' is a free, open-source license plate system maintained by the NTBI Group. Anyone can attach a GLPS license plate onto their own vehicle and sell their vehicle with GLPS license plates installed.<br />
<br />
==Overview==<br />
GLPS is the combination of a full-permissions model, script, PSD files, and web API. While designed for vehicle manufacturers, GLPS plates can be installed on any modifiable vehicle by simply linking them to the vehicle object.<br />
<br />
GLPS is designed to overcome formatting issues with license plates previously used on NTBI vehicles and those created by some other manufacturers. On those models, characters shown on the plate had to be displayed where the individual character faces were positioned on the model. Instead, GLPS uses an innovative text rendering technique that allows characters to be displayed effectively anywhere on the plate at any size while still using only one texture per font. This also allows GLPS plates to be resized automatically between US/Japan and UK/Euro sizes without needing to duplicate the entire plate for another size, because fonts can be changed and characters can be moved and scaled appropriately for each plate size and design.<br />
<br />
<big>[https://marketplace.secondlife.com/p/GLPS-Development-Kit-Full-Perm-Global-License-Plate-System-Plate/20803261 '''Click here''' for the GLPS developer kit.]</big><br />
<br />
<big>[https://ntbigroup.com/TEMPLATES/GLPS%20TEMPLATE%20JP%20US.psd '''Click here''' for the GLPS JP/US sized custom texture PSD.]</big><br />
<br />
<big>[https://ntbigroup.com/TEMPLATES/GLPS%20TEMPLATE%20EU%20RU%20UK.psd '''Click here''' for the GLPS EU/RU/UK sized custom texture PSD.]</big><br />
<br />
<big>For a list of default templates, scroll to the bottom of the page.</big><br />
<br />
==Compatible Vehicles==<br />
GLPS is being integrated into NTBI vehicles on a rolling basis. However, since GLPS is a free standard, other manufacturers may also implement GLPS on their vehicles.<br />
<br />
==Instructions==<br />
GLPS is very simple to install and use - see the instructions below.<br />
<br />
===For End-Users===<br />
Each manufacturer implements GLPS differently, so refer to your vehicle's owners guide.<br />
<br />
Most vehicles allow you to set a plate by navigating the vehicle's configuration menu.<br />
<br />
If you are developing your own vehicle, or for some reason you cannot access the GLPS configuration menu, drop the ''NTBI GLPS Configuration Tool'' script into the vehicle. It will send the command to open the GLPS configuration menu and immediately delete itself.<br />
<br />
===For Vehicle Developers===<br />
Follow the instructions at the top of the script inside the plate to set it up for your vehicle.<br />
<br />
GLPS plates can be configured two ways - either by sending a command that causes the plate to send the user the GLPS configuration menu, or by sending configuration information directly to the plate.<br />
<br />
To trigger the GLPS configuration menu for the owner, use:<br />
<br />
llMessageLinked(LINK_SET, 0, "GLPS_OPEN_MENU", "");<br />
<br />
To set the plate number, use:<br />
<br />
llMessageLinked(LINK_SET, 0, "GLPS_SET_NUMBER", "[plate number]");<br />
<br />
To load a template directly, use:<br />
<br />
llMessageLinked(LINK_SET, 0, "GLPS_LOAD_TEMPLATE", "[template code]");<br />
<br />
To request the current GLPS config, use:<br />
<br />
llMessageLinked(LINK_SET, 0, "GLPS_GET_DATA", "");<br />
<br />
This will return:<br />
<br />
llMessageLinked(LINK_SET, 0, "GLPS_GOT_DATA", "[JSON object of GLPS config]");<br />
<br />
To load a GLPS config, use:<br />
<br />
llMessageLinked(LINK_SET, 0, "GLPS_LOAD_DATA", "[JSON object of GLPS config]");<br />
<br />
You may also want to set the current template ID using:<br />
<br />
llMessageLinked(LINK_SET, 0, "GLPS_SET_TEMPLATE_ID", "[template code]");<br />
<br />
Note that this will not actually load the template, but can be used to force the template code into memory.<br />
<br />
===For Roleplay Managers and Other Developers===<br />
GLPS plates can be "read" using a chat command, which facilitates simulated ALPR cameras. Communication to the plate is performed on a pseudo-random channel, and communication back to the reader is sent on channel 2250. The command is as follows:<br />
<br />
key vehicle_key = llDetectedKey(0); // this key can be obtained any way you want<br />
llRegionSay(-1 - (integer)("0x" + llGetSubString((string)vehicle_key, -7, -1)), "GLPS_SCAN|" + (string)vehicle_key);<br />
<br />
The response, sent to channel 2250, will be:<br />
<br />
GLPS_SCANNED|[vehicle_key]|[template code]|[plate number]<br />
<br />
<code>[template code]</code> is the code of the default template, if used. If the plate has any modifications, or is using a custom code, <code>[template code]</code> will be "XXXXX".<br />
<br />
==Frequently Asked Questions==<br />
<br />
=====Can I change the number on my plate?=====<br />
<br />
Yes. Open the GLPS configuration menu and select ''Number...'', then enter your desired number. Note that for some plates, such as the default Second Life US-style plate, only a specific number of characters can be entered.<br />
<br />
=====Can I change the plate design/template to something else?=====<br />
<br />
Yes. Open the GLPS configuration menu and select ''Templates...'' -> ''Load...'', then enter the template code of the template you want to use. The template code will load a plate texture, layout, and font. Scroll down for a list of public template codes.<br />
<br />
=====Can I use my own plate textures?=====<br />
<br />
Yes. Open the GLPS configuration menu and select ''Templates...'' -> ''Customize...'' -> ''Texture...'', then paste the texture UUID in the text box. Then, if prompted, select whether you want to apply that texture to the ''Front'', ''Back'', or ''Both'' plates. Then select ''Layout...'' and apply a default layout or change the layout as needed to fit the texture. Then, if desired, select ''Font...'' and select your desired font.<br />
<br />
=====My plate texture already has numbers on it, can I still use it?=====<br />
<br />
Yes. Open the GLPS configuration menu and select ''Number...'' -> ''Clear Number'', then follow the instructions above to use a custom texture UUID.<br />
<br />
=====Why does my plate use an invalid combination of letters and numbers for my state/country? <br>Why does the Japanese plate not use only numbers? <br>Why does the hiragana character on the Japanese plate not match the vehicle type?=====<br />
<br />
Due to how GLPS works, plates are issued semi-randomly using both letters and numbers regardless of whether that would be an appropriate combination in real life for each jurisdiction and vehicle type. If you like, you can change the number to something appropriate.<br />
<br />
=====My country isn't included among the default templates, how do I add it?=====<br />
<br />
Download the PSD file and design a template in Photoshop, or use someone else's template.<br />
<br />
Note that GLPS plates are limited to 7 characters, so some plates (such as those issued in Russia) cannot be rendered fully.<br />
<br />
Note also that characters on GLPS plates are flexible but generally cannot be made small enough to be stacked on top of each other, as seen on certain US specialty plates. Therefore, if you are making a specialty plate template that uses two characters stacked on top of each other, we recommend that you include those characters directly on the template if possible.<br />
<br />
Finally, keep in mind that GLPS can only display 0-9, A-Z, certain Japanese hiragana (see below), and the following special characters: -.: GLPS cannot display registration or inspection stickers, other special characters, or non-English characters.<br />
<br />
If you design a real-life plate template that is not in the default templates, send an IM to Nelson Jenkins and we will review it to see if it would be appropriate to add to the default templates. Note that we will only add templates that are effectively identical to real-life plates.<br />
<br />
=====Why do you call them "license plates" and not "registration plates" or "number plates"?=====<br />
<br />
Because the person who developed GLPS is an American. Sorry.<br />
<br />
=====What plate sizes are available?=====<br />
<br />
GLPS includes, by default, 12x6 inch (305x152 mm) plates for Japan/US and 520x130 mm plates for Europe/Russia/UK. Other sizes may be available for specific jurisdictions, but these two sizes are the only ones that we provide PSDs for.<br />
<br />
Some trivia as to why the UK/Europe GLPS size is not accurate: all US states and Canadian provinces managed to agree on a reasonable, delightfully proportional 12x6 inch standard all the way back in 1956, which fits perfectly onto a 512x256 px texture. Europe, meanwhile, mostly uses 520x110 mm or 520x120 mm plates with horrendous 52:11 and 13:3 aspect ratios, with many countries using completely different sizes for no clear reason, including some even using the 12x6 inch format. Because of this, GLPS also bucks the trend with a "standard" 520x130 mm plate to facilitate the use of a 512x128 px texture.<br />
<br />
=====Are motorcycle plates available?=====<br />
<br />
While GLPS does not include any templates for smaller motorcycle plates, you may create your own using the PSD file and instructions above. However, it will be difficult if not impossible to render characters in two rows as seen on most European motorcycle plates due to technical limitations of the font textures.<br />
<br />
=====What information is stored by the GLPS web API?=====<br />
<br />
The GLPS API, hosted by Northbridge Business Systems, only stores the plate template (design only, no text) and plate owner's UUID when copying a plate template code. This data is not available to the public and is only used for detecting abuse of the template code generation service. This service is necessary because plate configurations are very long and are not easy to load into the plate manually. GLPS does not store any information about the vehicle, such as its position, speed, driver, or model, except for the vehicle owner's UUID as a consequence of storing the plate owner's UUID.<br />
<br />
=====Why is an NBS API key required?=====<br />
The GLPS API hosts saved plate data as described above. There is currently no limit to the number of plates any one person can save. To allow NBS to monitor the system for abuse, an NBS API key is required for calls that either read or store custom plate data.<br />
<br />
=====How are default plate numbers assigned?=====<br />
<br />
Plate numbers are generated as seven-digit strings, and if the plate template cannot display seven digits, only the first digits are displayed up to the maximum. The first two characters are random alphanumeric characters, the third character is the first character of the region name that the car is first rezzed in, the fourth through sixth characters are the last three digits of the current Unix timestamp, and the last character is a random alphanumeric character.<br />
<br />
=====Are plate numbers unique or searchable?=====<br />
<br />
No. Due to privacy concerns, we chose to make plate numbers pseudo-random and they might not be unique. However, plate numbers only change when the vehicle owner changes or the plate is edited by the user, so plate numbers will persist even if the vehicle is taken and re-rezzed.<br />
<br />
=====Why is the layout/font not accurate for my state/country?=====<br />
<br />
We have tried to implement as many plate designs as we could, but the person who developed GLPS is a stupid American, so many of the European plates are wrong because we do not have access to every accurate font, and we do not have the time to make sure every state plate is pixel-perfect. Different states and countries use a wide variety of fonts, layouts, decals, additional stickers, and sizes. We have attempted to emulate these formats, but the layout and font may not be completely accurate in every case.<br />
<br />
=====For European plates with inspection stickers, can they be changed?=====<br />
<br />
While you are welcome to make your own inspection sticker, the sticker on the template is the only inspection sticker possible by default. We have thus attempted to avoid referring to any specific year on the default templates.<br />
<br />
=====For Russian plates, can the region number be changed to not say "SL"?=====<br />
<br />
No. Due to the fact that GLPS can only render 7 characters, the region code was replaced with "SL", but you can edit the default template to set a custom region number if you like.<br />
<br />
=====What does the Japanese plate say at the top?=====<br />
<br />
The kanji at the top reads "import" and the number to the right is the vehicle class code, which is estimated depending on the plate type you use, but can be edited (see above). Realistically, the kanji would indicate the local office that issued the plate, but incorporating all of the possible office codes would make the characters unreadable. For more information, [https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Japan see the relevant Wikipedia article.] It is also possible that the kanji reads something totally nonsensical or that we glossed over an appropriate real-life alternative that could have been used, since the person who developed GLPS is a baka gaijin.<br />
<br />
=====For Japanese plates, can I change the issuing office and class codes at the top of the plate?=====<br />
<br />
Yes, but this can only be done by making your own texture using the PSD file in Photoshop. Due to Second Life limitations, only the hiragana character and sequential digits can be changed in-world.<br />
<br />
=====For Japanese plates, how do I display dots instead of leading zeroes?=====<br />
<br />
Use ":" (the colon punctuation mark) for each centered dot.<br />
<br />
=====For Japanese plates, how do I enter the hiragana character?=====<br />
<br />
GLPS will accept hiragana in the number input. Alternatively, you can use the following romanji and punctuation that are mapped to the following hiragana:<br />
<br />
{| class="wikitable" style="text-align:center;"<br />
|-<br />
! 0 || 1 || 2 || 3 || 4 || 5 || 6 || 7 || 8 || 9 || A || B || C || D || E || F || G || H || I || J<br />
|-<br />
| さ || す || せ || そ || た || ち || つ || て || と || な || に || ぬ || ね || の || は || ひ || ふ || ほ || ま || み<br />
|-<br />
! K || L || M || N || O || P || Q || R || S || T || U || V || W || X || Y || Z || - || . || : || @<br />
|-<br />
| む || め || も || や || ゆ || よ || ら || り || る || ろ || あ || い || う || え || か || き || く || け || こ || を<br />
|}<br />
<br />
Note that the hiragana mapped to 0-9 and A-T are used on private vehicles and those mapped to U-Z and punctuation are used on commercial vehicles, though due to the nature of GLPS, these combinations are not always accurate. Also, GLPS does not support the れ and わ "rental vehicle" hiragana due to space limitations, and does not support any of the following hiragana not valid on license plates: 'ばだがぱざびぢぎぴじぶづぐぷずべでげペぜぼどごぽぞゑゐ<br />
<br />
=====What are the default templates?=====<br />
<br />
Below is a list of default template codes:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Code || Size || Digits || Description<br />
|-<br />
| GLPSD/SLUSS || JP/US || 6 || Second Life Default (US Style)<br />
|-<br />
| GLPSD/SLUSV || JP/US || 1-7 || Second Life Vanity (US Style)<br />
|-<br />
| GLPSD/SLMBE || JP/US || 1-7 || Second Life Mainland - Bellisseria<br />
|-<br />
| GLPSD/SLMBS || JP/US || 1-7 || Second Life Mainland - Blake Sea<br />
|-<br />
| GLPSD/SLMCO || JP/US || 1-7 || Second Life Mainland - Corsica<br />
|-<br />
| GLPSD/SLMGI || JP/US || 1-7 || Second Life Mainland - Gaeta Islands<br />
|-<br />
| GLPSD/SLMHE || JP/US || 1-7 || Second Life Mainland - Heterocera<br />
|-<br />
| GLPSD/SLMJE || JP/US || 1-7 || Second Life Mainland - Jeogeot<br />
|-<br />
| GLPSD/SLMNA || JP/US || 1-7 || Second Life Mainland - Nautilus<br />
|-<br />
| GLPSD/SLMSA || JP/US || 1-7 || Second Life Mainland - Sansara<br />
|-<br />
| GLPSD/SLMST || JP/US || 1-7 || Second Life Mainland - Satori<br />
|-<br />
| GLPSD/SLMSC || JP/US || 1-7 || Second Life Mainland - Sharp Continent<br />
|-<br />
| GLPSD/SLMZI || JP/US || 1-7 || Second Life Mainland - Zindra<br />
|-<br />
| GLPSD/JPPSS || JP/US || 5 || Japan - Private<br />
|-<br />
| GLPSD/JPPKS || JP/US || 5 || Japan - Private Kei<br />
|-<br />
| GLPSD/JPCSS || JP/US || 5 || Japan - Commercial<br />
|-<br />
| GLPSD/JPCKS || JP/US || 5 || Japan - Commercial Kei<br />
|-<br />
| GLPSD/JPTPS || JP/US || 5 || Japan - Temporary<br />
|-<br />
| GLPSD/USCAS || JP/US || 1-7 || United States - California<br />
|-<br />
| GLPSD/USCAB || JP/US || 1-7 || United States - California (Black)<br />
|-<br />
| GLPSD/USNJS || JP/US || 6 || United States - New Jersey<br />
|-<br />
| GLPSD/USNJV || JP/US || 1-7 || United States - New Jersey Vanity<br />
|-<br />
| GLPSD/USNYS || JP/US || 7 || United States - New York<br />
|-<br />
| GLPSD/USNYV || JP/US || 1-7 || United States - New York Vanity<br />
|-<br />
| GLPSD/USNYA || JP/US || 7 || United States - New York (2010s)<br />
|-<br />
| GLPSD/USNYB || JP/US || 1-7 || United States - New York Vanity (2010s)<br />
|-<br />
| GLPSD/USNYC || JP/US || 1-7 || United States - New York Livery (2010s)<br />
|-<br />
| GLPSD/USNYD || JP/US || 1-7 || United States - New York T&LC (2010s)<br />
|-<br />
| GLPSD/USNYE || JP/US || 7 || United States - New York (2000s)<br />
|-<br />
| GLPSD/USNYF || JP/US || 1-7 || United States - New York Vanity (2000s)<br />
|-<br />
| GLPSD/USNYG || JP/US || 1-7 || United States - New York Livery (2000s)<br />
|-<br />
| GLPSD/USNYH || JP/US || 1-7 || United States - New York T&LC (2000s)<br />
|-<br />
| GLPSD/USNYI || JP/US || 6 || United States - New York (1990s)<br />
|-<br />
| GLPSD/USNYJ || JP/US || 6 || United States - New York Vanity (1990s)<br />
|-<br />
| GLPSD/USNYK || JP/US || 6 || United States - New York Livery (1990s)<br />
|-<br />
| GLPSD/USNYL || JP/US || 6 || United States - New York T&LC (1990s)<br />
|-<br />
| GLPSD/USNYM || JP/US || 6 || United States - New York Commercial (1990s)<br />
|-<br />
| GLPSD/USPAS || JP/US || 7 || United States - Pennsylvania<br />
|-<br />
| GLPSD/USPAV || JP/US || 1-7 || United States - Pennsylvania Vanity<br />
|-<br />
| GLPSD/USTXS || JP/US || 7 || United States - Texas<br />
|-<br />
| GLPSD/USTXV || JP/US || 1-7 || United States - Texas Vanity<br />
|-<br />
| GLPSD/SLEUS || EU/RU/UK || 1-7 || Second Life Default (EU Style)<br />
|-<br />
| GLPSD/EUALS || EU/RU/UK || 7 || Albania<br />
|-<br />
| GLPSD/EUAAS || EU/RU/UK || 6 || Austria<br />
|-<br />
| GLPSD/EUBYS || EU/RU/UK || 7 || Belarus<br />
|-<br />
| GLPSD/EUBBS || EU/RU/UK || 7 || Belgium<br />
|-<br />
| GLPSD/EUBIS || EU/RU/UK || 7 || Bosnia and Herzegovina<br />
|-<br />
| GLPSD/EUBGS || EU/RU/UK || 7 || Bulgaria<br />
|-<br />
| GLPSD/EUHRS || EU/RU/UK || 7 || Croatia<br />
|-<br />
| GLPSD/EUCZS || EU/RU/UK || 7 || Czech Republic<br />
|-<br />
| GLPSD/EUDKS || EU/RU/UK || 7 || Denmark<br />
|-<br />
| GLPSD/EUDKC || EU/RU/UK || 7 || Denmark - Commercial<br />
|-<br />
| GLPSD/EUDKP || EU/RU/UK || 7 || Denmark - "Parrot"<br />
|-<br />
| GLPSD/EUESS || EU/RU/UK || 6 || Estonia<br />
|-<br />
| GLPSD/EUFIS || EU/RU/UK || 6 || Finland<br />
|-<br />
| GLPSD/EUFFS || EU/RU/UK || 7 || France<br />
|-<br />
| GLPSD/EUDDS || EU/RU/UK || 7 || Germany<br />
|-<br />
| GLPSD/EUGRS || EU/RU/UK || 7 || Greece<br />
|-<br />
| GLPSD/EUHHS || EU/RU/UK || 6 || Hungary<br />
|-<br />
| GLPSD/EUISS || EU/RU/UK || 5 || Iceland<br />
|-<br />
| GLPSD/EUIRS || EU/RU/UK || 7 || Ireland<br />
|-<br />
| GLPSD/EUIIS || EU/RU/UK || 7 || Italy<br />
|-<br />
| GLPSD/EULVS || EU/RU/UK || 6 || Latvia<br />
|-<br />
| GLPSD/EULIS || EU/RU/UK || 7 || Liechtenstein<br />
|-<br />
| GLPSD/EULTS || EU/RU/UK || 6 || Lithuania<br />
|-<br />
| GLPSD/EULLS || EU/RU/UK || 6 || Luxembourg<br />
|-<br />
| GLPSD/EUMMS || EU/RU/UK || 6 || Malta<br />
|-<br />
| GLPSD/EUMDS || EU/RU/UK || 6 || Moldova<br />
|-<br />
| GLPSD/EUMNS || EU/RU/UK || 7 || Montenegro<br />
|-<br />
| GLPSD/EUNLS || EU/RU/UK || 6 || Netherlands<br />
|-<br />
| GLPSD/EUNMS || EU/RU/UK || 7 || North Macedonia<br />
|-<br />
| GLPSD/EUNNS || EU/RU/UK || 7 || Norway<br />
|-<br />
| GLPSD/EUPLS || EU/RU/UK || 7 || Poland<br />
|-<br />
| GLPSD/EUPPS || EU/RU/UK || 6 || Portugal<br />
|-<br />
| GLPSD/EUROS || EU/RU/UK || 7 || Romania<br />
|-<br />
| GLPSD/EUSRS || EU/RU/UK || 7 || Serbia<br />
|-<br />
| GLPSD/EUSKS || EU/RU/UK || 7 || Slovakia<br />
|-<br />
| GLPSD/EUSLS || EU/RU/UK || 7 || Slovenia<br />
|-<br />
| GLPSD/EUEES || EU/RU/UK || 7 || Spain<br />
|-<br />
| GLPSD/EUSSS || EU/RU/UK || 6 || Sweden<br />
|-<br />
| GLPSD/EUUAS || EU/RU/UK || 7 || Ukraine<br />
|-<br />
| GLPSD/RURUS || EU/RU/UK || 6 || Russia<br />
|-<br />
| GLPSD/UKUKS || EU/RU/UK || 7 || United Kingdom (Front/Rear)<br />
|-<br />
| GLPSD/UKEUS || EU/RU/UK || 7 || United Kingdom EU (Front/Rear)<br />
|-<br />
| GLPSD/THPCS || Custom || 6 || Thailand - Private Car<br />
|-<br />
| GLPSD/THPVS || Custom || 6 || Thailand - Private Van<br />
|-<br />
| GLPSD/THPPS || Custom || 6 || Thailand - Private 2DR Pickup<br />
|-<br />
| GLPSD/THPTS || Custom || 6 || Thailand - Private Motorized Tricycle<br />
|-<br />
| GLPSD/THTCS || Custom || 6 || Thailand - Taxi<br />
|-<br />
| GLPSD/THSCS || Custom || 6 || Thailand - Service Vehicle<br />
|}<br />
<br />
=====What are the default fonts?=====<br />
<br />
Below is a list of default font codes:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Code || Description<br />
|-<br />
| US1 || United States - Generic 1<br />
|-<br />
| US2 || United States - Generic 2<br />
|-<br />
| USCA || United States - California<br />
|-<br />
| USFL || United States - Florida<br />
|-<br />
| USIL || United States - Illinois<br />
|-<br />
| USMA || United States - Massachusetts<br />
|-<br />
| USMD || United States - Maryland<br />
|-<br />
| USMI || United States - Michigan<br />
|-<br />
| USMO || United States - Missouri<br />
|-<br />
| USNC || United States - North Carolina<br />
|-<br />
| USNJ || United States - New Jersey<br />
|-<br />
| USNY || United States - New York<br />
|-<br />
| USOH || United States - Ohio<br />
|-<br />
| USPA || United States - Pennsylvania<br />
|-<br />
| USVA || United States - Virginia<br />
|-<br />
| USWA || United States - Washington<br />
|-<br />
| USWI || United States - Wisconsin<br />
|-<br />
| CAON || Canada - Ontario<br />
|-<br />
| CAQC || Canada - Quebec<br />
|-<br />
| UK || United Kingdom<br />
|-<br />
| EU1 || Europe - Generic 1<br />
|-<br />
| EU2 || Europe - Generic 2<br />
|-<br />
| EU3 || Europe - Generic 3<br />
|-<br />
| JPR || Japan - Romaji/Numerals<br />
|-<br />
| JPH || Japan - Hiragana<br />
|}</div>NelsonJenkinshttps://wiki.ntbigroup.com/index.php?title=Global_Vehicle_HUD&diff=2945Global Vehicle HUD2021-04-05T03:01:29Z<p>NelsonJenkins: /* Vehicle Manufacturer Instructions */</p>
<hr />
<div>The '''Global Vehicle HUD (GVHUD)''' is a free, open-use HUD provided by the NTBI Group. Anyone can implement GVHUD compatibility into their vehicle and the GVHUD is available for free.<br />
<br />
==Overview==<br />
The GVHUD is a dynamically customizable HUD intended for use by vehicle manufacturers. Manufacturers can use the GVHUD to control different aspects of the vehicle without designing their own HUD.<br />
<br />
The NTBI Group does not maintain a list of compatible vehicles. GVHUD-compatible products should clearly label themselves as such. The NTBI Group does not provide any warranty or support for third-party GVHUD implementations.<br />
<br />
<big>[https://marketplace.secondlife.com/p/Global-Vehicle-HUD-Latest-Version-for-GVHUD-Compatible-Vehicles/20803267 '''Click here''' for the latest version of the GVHUD.]</big><br />
<br />
==End-User Instructions==<br />
Wear the GVHUD by right clicking it in your inventory and selecting "Wear" or "Add". You can also attach it to a different HUD slot (default Top), but you will likely need to reposition it manually.<br />
<br />
You can position the GVHUD as desired in both hidden and shown mode. When hidden or shown, the GVHUD will reposition itself to the position it was last placed in while in that mode.<br />
<br />
The GVHUD layout includes three main sections - a set of per-vehicle customizable buttons, an LCD display with soft buttons, and HIDE and GSTR buttons, which hide the GVHUD and send a folder with gesture keybinds, respectively. The customizable buttons and LCD display layout is different for each vehicle; refer to your vehicle's owner's guide for details.<br />
<br />
==Vehicle Manufacturer Instructions==<br />
Vehicle manufacturers must implement the following API on their own; no support is provided.<br />
<br />
All communication with the GVHUD is done via channel <code>47504750</code>.<br />
<br />
The following commands can be sent from the vehicle to the GVHUD using llRegionSayTo to the avatar's UUID, or the HUD UUID if preferred:<br />
<br />
* '''SYN'''<br />
** Format: <code>SYN</code><br />
** Should be sent by the vehicle when the driver sits. Must only be sent to the driver's avatar UUID, otherwise crosstalk will occur. GVHUD will respond with '''CON'''.<br />
* '''ACK'''<br />
** Format: <code>ACK|[vehicle name]|[array of button ID numbers]|[array of button latch flags]|[array of button states]|[siren main prim UUID]|[siren reverb prim UUID]|[siren name]|[switch state]</code><br />
** Should be sent by the vehicle in response to '''CON'''. Vehicle should also send '''MNU''' immediately after, if desired.<br />
** [vehicle name] is the name of the vehicle to display on the LCD, up to 22 characters.<br />
** [array of button ID numbers] is a comma-separated list of button ID numbers from the table below. The array must be exactly 30 buttons, ordered from 8 left to right at the top (excluding buttons above the LCD), 8 left to right in the center, 8 left to right on the bottom, then 6 left to right above the LCD.<br />
** [array of button latch flags] is a comma-separated list of button latch flags, either 0 for momentary or 1 for latched. The array must be exactly 30 buttons, organized the same as above.<br />
** [array of button states] is a comma-separated list of button states, either 0 for off or 1 for on. The array must be exactly 30 buttons, organized the same as above.<br />
** [siren main prim UUID] and [siren reverb prim UUID] are the prim UUIDs of the siren emitter prims. See below for details.<br />
** [siren name] is the name of the currently installed siren. Possible sirens are: GT6500, GT20A, VR900, BF200, UG4000, SP700, GT4500, MP224, eM, PC9, MP224E, EURO1<br />
** [switch state] is the state of the four-position switch, either 0, 1, 2, or 3.<br />
* '''MNU'''<br />
** Format: <code>MNU|[JSON menu data]</code><br />
** Should be sent by the vehicle immediately after '''ACK''' and can be sent whenever the vehicle wants to set up a new LCD soft button menu tree, if desired.<br />
** [JSON menu data] is a JSON array of menu items, which are JSON objects. Each menu item has the following attributes:<br />
*** "l": label to display for menu item, a string of up to 8 characters, wrapped onto 2 lines of 4 characters each. To skip a menu item on the display, use an empty label ("").<br />
*** "sub" (optional): a JSON array of menu items. If specified, opens a new menu when this menu item is selected.<br />
*** "act" (optional): an action to perform when this menu item is selected. Can be one of the following:<br />
**** "back": Moves back to the previous menu, if a submenu.<br />
**** "help": Opens GVHUD help URL.<br />
** To close the menu, send a blank string ("") for [JSON menu data].<br />
* '''TXT'''<br />
** Format: <code>TXT|[row number]|[text]</code><br />
** Can be sent by the vehicle to render text on the LCD. The GVHUD must have sent '''RFR''' first to signal that the display is ready, otherwise commands will be dropped.<br />
** [row number] is the row number, from 0 to 3, to render text on. If a menu is currently active, using row numbers 2 or 3 will close the menu.<br />
** [text] is the text to render, up to 24 characters.<br />
* '''MSG'''<br />
** Format: <code>MSG|[text]</code><br />
** Can be sent by the vehicle to send a chat message to the HUD wearer.<br />
* '''UPD'''<br />
** Format: <code>UPD|[button index]|[button ID]|[state]</code><br />
** Can be sent by the vehicle to update a button state on the GVHUD. Note that no processing will be performed for this button, so '''BTN''' will not be sent.<br />
** [button index] is the index of the button in the button arrays, 0 to 29. Alternatively, [button index] can be set to -1 to use [button ID] instead.<br />
** [button ID] is the button ID from the table below. Can be used if the vehicle would prefer handling commands via the button ID instead of the button index, but is very slightly slower. If [button index] is not -1, [button ID] is ignored.<br />
** [state] is 0 for off or 1 for on.<br />
* '''SIS'''<br />
** Format: <code>SIS|[siren name]</code><br />
** Can be sent by the vehicle to install a siren outside of '''ACK'''.<br />
** [siren name] is the name of the newly installed siren; see '''ACK''' for a list of possible sirens.<br />
* '''SSS'''<br />
** Format: <code>SSS|[siren state]</code><br />
** Should be sent by the vehicle if another GVHUD sends '''SST''', or if the vehicle has activated a park kill feature.<br />
** [siren state] should be the [siren state] string provided by '''SST'''. [siren state] can also be "off" (without quotes) if the vehicle has a park kill feature.<br />
* '''SVU'''<br />
** Format: <code>SWU|[switch state]</code><br />
** Should be sent by the vehicle if another GVHUD sends '''SWS'''.<br />
** [switch state] should be the [switch state] integer provided by '''SWS'''.<br />
* '''DIS'''<br />
** Format: <code>DIS</code><br />
** Should be sent by the vehicle when the driver unsits.<br />
<br />
The following commands will be sent by the GVHUD to the vehicle using llRegionSayTo to the prim UUID of the object that sent '''ACK''' unless otherwise specified:<br />
<br />
* '''OPT'''<br />
** Format: <code>OPT|[menu label]</code><br />
** Sent by the GVHUD when a menu item is selected. Sent on every selection, including when switching to a submenu.<br />
** [menu label] is the label of the selected menu item.<br />
* '''RFR'''<br />
** Format: <code>RFR</code><br />
** Sent by the GVHUD when it is ready to accept '''TXT''' commands. Vehicle should start sending '''TXT''' commands once it receives '''RFR''' after '''CON'''.<br />
* '''BTN'''<br />
** Format: <code>BTN|[button index]|[button ID]|[state]</code><br />
** Sent by the GVHUD when a button is pressed or released.<br />
** [button index] is the index of the button in the button arrays, 0 to 29.<br />
** [button ID] is the button ID from the table below.<br />
** [state] is 0 for off or 1 for on.<br />
* '''GST'''<br />
** Format: <code>GST|[command]</code><br />
** Sent by the GVHUD when a gesture hotkey is used.<br />
** [command] can be one of the commands described in Gesture Controls below.<br />
* '''SRN'''<br />
** Format: <code>SRN|[sound UUID]</code><br />
** Sent by the GVHUD ''directly to the siren emitter prim specified by '''ACK''' only'' to cause it to play a siren sound.<br />
** [sound UUID] is a sound to play, or NULL_KEY to stop sounds.<br />
* '''SST'''<br />
** Format: <code>SST|[siren state]</code><br />
** Sent by the GVHUD when the siren mode changed. If multiple GVHUDs are attached, the vehicle should send '''SSS''' to the other GVHUD.<br />
** [siren state] is the state of the siren.<br />
* '''SWS'''<br />
** Format: <code>SWS|[switch state]</code><br />
** Sent by the GVHUD when the switch is moved. If multiple GVHUDs are attached, the vehicle should send '''SWU''' to the other GVHUD.<br />
* '''CON'''<br />
** Format: <code>CON</code><br />
** Sent by the GVHUD when it is attached/reset, or in response to '''SYN'''.<br />
<br />
===Siren Interface===<br />
If a siren is used, two prims must be designated as siren sound emitter prims. Their UUIDs should be detected and sent in '''ACK'''.<br />
<br />
To reduce latency, the GVHUD sends '''SRN''' commands directly to the prims designated by '''ACK'''. Each prim must listen for '''SRN''' independently of the script that handles other GVHUD communication, and should play siren sounds as sent by the GVHUD. A sample script is below, which should be placed in each of the prims designated as siren emitter prims:<br />
<br />
default<br />
{<br />
state_entry()<br />
{<br />
llListen(-47504750, "", "", "");<br />
}<br />
listen(integer channel, string name, key id, string message)<br />
{<br />
if (llGetSubString(message, 0, 3) == "SRN|" && id == hud_uuid)<br />
{<br />
string uuid = llGetSubString(message, 4, -1);<br />
if (uuid == NULL_KEY) llStopSound();<br />
else llLoopSound(uuid, 1.0);<br />
}<br />
}<br />
}<br />
<br />
Sound emitter scripts must verify that the object that sent the '''SRN''' command is the connected GVHUD. This script snippet does not define <code>hud_uuid</code>; it must be set when the script that controls GVHUD communication sends '''ACK''' so that the emitter knows the UUID of the connected GVHUD.<br />
<br />
===Gesture Controls===<br />
The gestures provided in the GVHUD send the following internal commands:<br />
<br />
* '''F2''': "ZF2", resizes GVHUD.<br />
* '''F3''': "ZF3", toggles axle lock (button ID 28), if equipped, otherwise ignored.<br />
* '''F4''': "ZF4", cycles through hands-free siren tones, if eqipped, otherwise ignored.<br />
* '''F5''': "ZF5", moves switch to position 0.<br />
* '''F6''': "ZF6", moves switch to position 1.<br />
* '''F7''': "ZF7", moves switch to position 2.<br />
* '''F8''': "ZF8", moves switch to position 3.<br />
* '''Ctrl + Left''': "ZCA", toggles turn L (button ID 24), if equipped, otherwise ignored.<br />
* '''Ctrl + Right''': "ZCD", toggles turn L (button ID 29), if equipped, otherwise ignored.<br />
* '''Ctrl + Down''': "ZCS", toggles hazards (button ID 25), if equipped, otherwise ignored.<br />
* '''H''': "ZZH", horn tap, sends <code>GST|HORN</code>.<br />
* '''L''': "ZZL", toggles cycle headlights (button ID 26), if equipped, otherwise ignored.<br />
* '''K''': "ZZK", high beams flash, sends <code>GST|BRIGHT</code>.<br />
* '''I''': "ZZI", toggles key (button ID 7), if equipped, otherwise ignored.<br />
* '''O''': "ZZO", get out, sends <code>GST|OUT</code>.<br />
* '''Space''': "ZZ_", handbrake, sends <code>GST|BRAKE</code>.<br />
* '''1''': "ZZ1", camera 1, sends <code>GST|CAM1</code>.<br />
* '''2''': "ZZ2", camera 2, sends <code>GST|CAM2</code>.<br />
* '''3''': "ZZ3", camera 3, sends <code>GST|CAM3</code>.<br />
* '''4''': "ZZ4", camera 4, sends <code>GST|CAM4</code>.<br />
* '''5''': "ZZ5", camera 5, sends <code>GST|CAM5</code>.<br />
* '''6''': "ZZ6", camera 6, sends <code>GST|CAM6</code>.<br />
<br />
===Button IDs===<br />
The following is a list of available button IDs.<br />
<br />
This list can be expanded by the NTBI Group without a GVHUD update. If you have a button label you would like to be integrated into the GVHUD's available buttons, contact Nelson Jenkins.<br />
<br />
{| class="wikitable"<br />
|-<br />
! ID || Description || ID || Description || ID || Description || ID || Description<br />
|-<br />
| -10 || Siren Wail* || -11 || Siren Yelp* || -12 || Siren Priority* || -13 || Siren Manual*<br />
|-<br />
| -14 || Siren Horn* || -1 || Blank || || || || <br />
|-<br />
| 0 || LIGHT BAR (Red) || 1 || STRB (Red) || 2 || TKDN FLASH (Red) || 3 || TAKE DOWN (Red)<br />
|-<br />
| 4 || FLOOD (Red) || 5 || CRZ (Red) || 6 || (Reserved) || 7 || Key (Green)<br />
|-<br />
| 8 || HIDE AWAY (Red) || 9 || WIG WAG (Red) || 10 || Arrow (Red) || 11 || Siren Wail*<br />
|-<br />
| 12 || Siren Yelp* || 13 || Siren Priority* || 14 || Siren Manual* || 15 || Siren Horn*<br />
|-<br />
| 16 || AUX 1 || 17 || AUX 2 || 18 || AUX 3 || 19 || CUT F (Red)<br />
|-<br />
| 20 || CUT R (Red) || 21 || (Reserved) || 22 || (Reserved) || 23 || (Reserved)<br />
|-<br />
| 24 || Turn Sig L || 25 || Cycle Headlights || 26 || Hazard Flashers || 27 || Horn<br />
|-<br />
| 28 || Axle Lock || 29 || Turn Sig R || || || || <br />
|}<br />
<br />
<nowiki>*</nowiki> Use negative button IDs for GVHUD to handle the siren. The GVHUD will automatically pick the correct buttons to show, will only allow one on at a time, and will send siren commands directly to the prims specified in SSU. Use positive button IDs for sirens only if you want them to send BTN commands and not be connected together.</div>NelsonJenkinshttps://wiki.ntbigroup.com/index.php?title=Tredpro_Standard_Handcuffs&diff=2944Tredpro Standard Handcuffs2021-04-04T02:59:45Z<p>NelsonJenkins: Created page with "The '''Tredpro Standard Handcuffs''' are free police handcuffs provided by Tredpro and the NTBI Group. ==Overview== The Tredpro Standard Handcuffs come in black and nickel fi..."</p>
<hr />
<div>The '''Tredpro Standard Handcuffs''' are free police handcuffs provided by Tredpro and the NTBI Group.<br />
<br />
==Overview==<br />
The Tredpro Standard Handcuffs come in black and nickel finishes.<br />
<br />
Handcuffs are attached to other people using an applier tool. When worn, the user can aim in mouselook and click someone nearby. The handcuffs will attempt to attach to the person clicked.<br />
<br />
These handcuffs require attachment permissions from the wearer and do not use any RLV functions or otherwise restrict the wearer. They are for roleplay purposes only.<br />
<br />
An API is available for scripters wishing to check if someone is wearing the handcuffs.<br />
<br />
<big>[https://marketplace.secondlife.com/p/Tredpro-Standard-Handcuffs-Simple-Handcuffs-with-Applier-Tool-for-Police-and-Security-Roleplay/21656619 '''Click here''' for the latest version of the Tredpro Standard Handcuffs.]</big><br />
<br />
==API Instructions==<br />
Third-party roleplay manufacturers can implement the following API to manage handcuffs.<br />
<br />
All communication with the handcuffs is done via channel <code>-528199420</code>.<br />
<br />
The following commands can be sent to the handcuffs using llRegionSayTo to the requested avatar's UUID:<br />
<br />
* '''HANDCUFFS_CHECK'''<br />
** Format: <code>HANDCUFFS_CHECK</code><br />
** Can be sent to check if the user is wearing handcuffs. If so, '''HANDCUFFS_WORN''' is returned. If not, nothing is returned.<br />
** Can also be used with llRegionSay or other chat functions to detect all handcuffed users in the function's range.<br />
* '''HANDCUFFS_REMOVE'''<br />
** Format: <code>HANDCUFFS_REMOVE|[skip sound]|[removal message]</code><br />
** Can be sent to remove the handcuffs. If the object that sends this command is not owned by the wearer, the wearer will be notified of which object sent the command and who owns it.<br />
** Do not use llRegionSay or other chat functions with this command, or it may have unintended consequences.<br />
** [skip sound] is a flag to skip the removal sound, either 0 (play sound, default) or 1 (do not play sound).<br />
** [removal message] is the message sent to the wearer informing them that their handcuffs were removed.<br />
<br />
The following command will be sent from the handcuffs back to the object that sent the '''HANDCUFFS_CHECK''' command:<br />
<br />
* '''HANDCUFFS_WORN'''<br />
** Format: <code>HANDCUFFS_WORN</code><br />
** Sent in response to '''HANDCUFFS_CHECK''' if the handcuffs are being worn by the targeted user.<br />
** The handcuffs will always be owned by the wearer, so you can use llGetOwnerKey to determine who is wearing the handcuffs.</div>NelsonJenkinshttps://wiki.ntbigroup.com/index.php?title=Templates&diff=2943Templates2021-04-04T02:59:21Z<p>NelsonJenkins: </p>
<hr />
<div>The following templates are available for NTBI products:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Product Name !! Diffuse (base) !! Normal (bumpmap) !! Specular (reflective)<br />
|-<br />
| [[Astaro Eastman]] || [https://ntbigroup.com/TEMPLATES/ASTARO/eastmanliverytemplate.psd Truck PSD]<br>[https://ntbigroup.com/TEMPLATES/ASTARO/boxtrailertemplate.psd Box Trailer PSD]<br>[https://ntbigroup.com/TEMPLATES/ASTARO/flatbedtrailertemplate.psd Flatbed Trailer PSD]<br>[https://ntbigroup.com/TEMPLATES/ASTARO/tankertrailertemplate.psd Tanker Trailer PSD] || N/A || N/A<br />
|-<br />
| [[Astaro Imperial]] || [https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIliverydecaltemplate.psd Livery Decal PSD] [https://wiki.ntbigroup.com/images/4/49/NTBIliverydecaltemplatePNG.png PNG] || N/A || N/A<br />
|-<br />
| [[Astaro LFT-30|Astaro LFT-30 Light Tank]] || [https://ntbigroup.com/TEMPLATES/TANKTEMPLATE1.psd Main PSD]<br>[https://ntbigroup.com/TEMPLATES/TANKTEMPLATE2.psd Details PSD] || N/A || N/A<br />
|-<br />
| [[Astaro Stratum]] || [https://ntbigroup.com/TEMPLATES/ASTARO/stratumoutsidetemplate.psd Main PSD]<br>[https://ntbigroup.com/TEMPLATES/ASTARO/pizzasign.psd Pizza Sign PSD]<br>[https://ntbigroup.com/TEMPLATES/ASTARO/tunerparts.psd Tuner Parts PSD] || N/A || N/A<br />
|-<br />
| [[TPF-1 Engine|Astaro TPF-1 Engine]] || [https://ntbigroup.com/TEMPLATES/FIRE/EngineFront1.psd Front PSD]<br>[https://ntbigroup.com/TEMPLATES/FIRE/EngineBack1.psd Rear PSD]<br>[https://wiki.ntbigroup.com/images/c/c9/Enginefrontdecal.png Front Decal PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG] || N/A || N/A<br />
|-<br />
| [[TPF-2 Tanker|Astaro TPF-2 Tanker]] || [https://ntbigroup.com/TEMPLATES/FIRE/TankerFront1.psd Front PSD]<br>[https://ntbigroup.com/TEMPLATES/FIRE/TankerBack1.psd Rear PSD]<br>[https://wiki.ntbigroup.com/images/c/c9/Enginefrontdecal.png Front Decal PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG] || N/A || N/A<br />
|-<br />
| [[TPF-3 Ladder|Astaro TPF-3 Ladder]] || [https://ntbigroup.com/TEMPLATES/FIRE/EngineFront1.psd Front PSD]<br>[https://ntbigroup.com/TEMPLATES/FIRE/LadderBack1.psd Rear PSD]<br>[https://wiki.ntbigroup.com/images/7/7e/Tankersidedecal.png Side Decal PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG] || N/A || N/A<br />
|-<br />
| [[TPF-4 Ambulance|Astaro TPF-4 Ambulance]] || [https://ntbigroup.com/TEMPLATES/FIRE/TPF4%20Template%20Front.psd Front PSD] [https://ntbigroup.com/TEMPLATES/FIRE/TPF4%20Template%20FrontGIMP.xcf XCF (GIMP)]<br>[https://ntbigroup.com/TEMPLATES/FIRE/TPF4%20Template%20Back.psd Rear PSD] [https://ntbigroup.com/TEMPLATES/FIRE/TPF4%20Template%20BackGIMP.xcf XCF (GIMP)] || N/A || N/A<br />
|-<br />
| [[Lusch Motors Allstar]] || [[Lusch Motors templates|See here]] || N/A || N/A<br />
|-<br />
| [[Lusch Motors]] (all others) || [https://luschmotors.weebly.com/ See here] || N/A || N/A<br />
|-<br />
| [[SZYM Entourage]] 6 || [https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Entourage%20v6%20Exterior%20Template.psd PSD] || [https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Entourage%20v6%20Normal%20Template.tga TGA] || [https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Entourage%20v6%20Specular%20Template.tga TGA]<br />
|-<br />
| [[SZYM Entourage]] (sculpted) || [https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIliverydecaltemplate.psd Livery Decal PSD] [https://wiki.ntbigroup.com/images/4/49/NTBIliverydecaltemplatePNG.png PNG] || N/A || N/A<br />
|-<br />
| [[SZYM Intruder]] 6 || [https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Intruder%20v6%20Exterior%20Template.psd PSD] || [https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Intruder%20v6%20Normal%20Template.tga TGA] || [https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Intruder%20v6%20Specular%20Template.tga TGA]<br />
|-<br />
| [[SZYM Intruder]] (sculpted) || [https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIliverydecaltemplate.psd Livery Decal PSD] [https://wiki.ntbigroup.com/images/4/49/NTBIliverydecaltemplatePNG.png PNG] || N/A || N/A<br />
|-<br />
| [[SZYM Paladin]] 7 || [https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Paladin%207%20Cab%20Diffuse%20Template.psd Cab PSD]<br>[https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Paladin%207%20Bed%20Diffuse%20Template.psd Bed PSD] || N/A || [https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Paladin%207%20Specular%20Template.psd PSD]<br />
|-<br />
| [[SZYM Tahari]] || [https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIliverydecaltemplate.psd Livery Decal PSD] [https://wiki.ntbigroup.com/images/4/49/NTBIliverydecaltemplatePNG.png PNG] || N/A || N/A<br />
|-<br />
| [[TR-50 Fire Helmet|Tredpro TR-50 Fire Helmet]] || [https://ntbigroup.com/TEMPLATES/platetextureexample.psd Front Plate PSD] [https://wiki.ntbigroup.com/images/0/07/Helmetplateexample.png PNG] || N/A || N/A<br />
|}<br />
<br />
For products not in this list, please refer to the owner's manual for template links.</div>NelsonJenkinshttps://wiki.ntbigroup.com/index.php?title=Global_Vehicle_HUD&diff=2942Global Vehicle HUD2021-04-04T02:58:44Z<p>NelsonJenkins: Created page with "The '''Global Vehicle HUD (GVHUD)''' is a free, open-use HUD provided by the NTBI Group. Anyone can implement GVHUD compatibility into their vehicle and the GVHUD is available..."</p>
<hr />
<div>The '''Global Vehicle HUD (GVHUD)''' is a free, open-use HUD provided by the NTBI Group. Anyone can implement GVHUD compatibility into their vehicle and the GVHUD is available for free.<br />
<br />
==Overview==<br />
The GVHUD is a dynamically customizable HUD intended for use by vehicle manufacturers. Manufacturers can use the GVHUD to control different aspects of the vehicle without designing their own HUD.<br />
<br />
The NTBI Group does not maintain a list of compatible vehicles. GVHUD-compatible products should clearly label themselves as such. The NTBI Group does not provide any warranty or support for third-party GVHUD implementations.<br />
<br />
<big>[https://marketplace.secondlife.com/p/Global-Vehicle-HUD-Latest-Version-for-GVHUD-Compatible-Vehicles/20803267 '''Click here''' for the latest version of the GVHUD.]</big><br />
<br />
==End-User Instructions==<br />
Wear the GVHUD by right clicking it in your inventory and selecting "Wear" or "Add". You can also attach it to a different HUD slot (default Top), but you will likely need to reposition it manually.<br />
<br />
You can position the GVHUD as desired in both hidden and shown mode. When hidden or shown, the GVHUD will reposition itself to the position it was last placed in while in that mode.<br />
<br />
The GVHUD layout includes three main sections - a set of per-vehicle customizable buttons, an LCD display with soft buttons, and HIDE and GSTR buttons, which hide the GVHUD and send a folder with gesture keybinds, respectively. The customizable buttons and LCD display layout is different for each vehicle; refer to your vehicle's owner's guide for details.<br />
<br />
==Vehicle Manufacturer Instructions==<br />
Vehicle manufacturers must implement the following API on their own; no support is provided.<br />
<br />
All communication with the GVHUD is done via channel <code>-47504750</code>.<br />
<br />
The following commands can be sent from the vehicle to the GVHUD using llRegionSayTo to the avatar's UUID, or the HUD UUID if preferred:<br />
<br />
* '''SYN'''<br />
** Format: <code>SYN</code><br />
** Should be sent by the vehicle when the driver sits. Must only be sent to the driver's avatar UUID, otherwise crosstalk will occur. GVHUD will respond with '''CON'''.<br />
* '''ACK'''<br />
** Format: <code>ACK|[vehicle name]|[array of button ID numbers]|[array of button latch flags]|[array of button states]|[siren main prim UUID]|[siren reverb prim UUID]|[siren name]|[switch state]</code><br />
** Should be sent by the vehicle in response to '''CON'''. Vehicle should also send '''MNU''' immediately after, if desired.<br />
** [vehicle name] is the name of the vehicle to display on the LCD, up to 22 characters.<br />
** [array of button ID numbers] is a comma-separated list of button ID numbers from the table below. The array must be exactly 30 buttons, ordered from 8 left to right at the top (excluding buttons above the LCD), 8 left to right in the center, 8 left to right on the bottom, then 6 left to right above the LCD.<br />
** [array of button latch flags] is a comma-separated list of button latch flags, either 0 for momentary or 1 for latched. The array must be exactly 30 buttons, organized the same as above.<br />
** [array of button states] is a comma-separated list of button states, either 0 for off or 1 for on. The array must be exactly 30 buttons, organized the same as above.<br />
** [siren main prim UUID] and [siren reverb prim UUID] are the prim UUIDs of the siren emitter prims. See below for details.<br />
** [siren name] is the name of the currently installed siren. Possible sirens are: GT6500, GT20A, VR900, BF200, UG4000, SP700, GT4500, MP224, eM, PC9, MP224E, EURO1<br />
** [switch state] is the state of the four-position switch, either 0, 1, 2, or 3.<br />
* '''MNU'''<br />
** Format: <code>MNU|[JSON menu data]</code><br />
** Should be sent by the vehicle immediately after '''ACK''' and can be sent whenever the vehicle wants to set up a new LCD soft button menu tree, if desired.<br />
** [JSON menu data] is a JSON array of menu items, which are JSON objects. Each menu item has the following attributes:<br />
*** "l": label to display for menu item, a string of up to 8 characters, wrapped onto 2 lines of 4 characters each. To skip a menu item on the display, use an empty label ("").<br />
*** "sub" (optional): a JSON array of menu items. If specified, opens a new menu when this menu item is selected.<br />
*** "act" (optional): an action to perform when this menu item is selected. Can be one of the following:<br />
**** "back": Moves back to the previous menu, if a submenu.<br />
**** "help": Opens GVHUD help URL.<br />
** To close the menu, send a blank string ("") for [JSON menu data].<br />
* '''TXT'''<br />
** Format: <code>TXT|[row number]|[text]</code><br />
** Can be sent by the vehicle to render text on the LCD. The GVHUD must have sent '''RFR''' first to signal that the display is ready, otherwise commands will be dropped.<br />
** [row number] is the row number, from 0 to 3, to render text on. If a menu is currently active, using row numbers 2 or 3 will close the menu.<br />
** [text] is the text to render, up to 24 characters.<br />
* '''MSG'''<br />
** Format: <code>MSG|[text]</code><br />
** Can be sent by the vehicle to send a chat message to the HUD wearer.<br />
* '''UPD'''<br />
** Format: <code>UPD|[button index]|[button ID]|[state]</code><br />
** Can be sent by the vehicle to update a button state on the GVHUD. Note that no processing will be performed for this button, so '''BTN''' will not be sent.<br />
** [button index] is the index of the button in the button arrays, 0 to 29. Alternatively, [button index] can be set to -1 to use [button ID] instead.<br />
** [button ID] is the button ID from the table below. Can be used if the vehicle would prefer handling commands via the button ID instead of the button index, but is very slightly slower. If [button index] is not -1, [button ID] is ignored.<br />
** [state] is 0 for off or 1 for on.<br />
* '''SIS'''<br />
** Format: <code>SIS|[siren name]</code><br />
** Can be sent by the vehicle to install a siren outside of '''ACK'''.<br />
** [siren name] is the name of the newly installed siren; see '''ACK''' for a list of possible sirens.<br />
* '''SSS'''<br />
** Format: <code>SSS|[siren state]</code><br />
** Should be sent by the vehicle if another GVHUD sends '''SST''', or if the vehicle has activated a park kill feature.<br />
** [siren state] should be the [siren state] string provided by '''SST'''. [siren state] can also be "off" (without quotes) if the vehicle has a park kill feature.<br />
* '''SVU'''<br />
** Format: <code>SWU|[switch state]</code><br />
** Should be sent by the vehicle if another GVHUD sends '''SWS'''.<br />
** [switch state] should be the [switch state] integer provided by '''SWS'''.<br />
* '''DIS'''<br />
** Format: <code>DIS</code><br />
** Should be sent by the vehicle when the driver unsits.<br />
<br />
The following commands will be sent by the GVHUD to the vehicle using llRegionSayTo to the prim UUID of the object that sent '''ACK''' unless otherwise specified:<br />
<br />
* '''OPT'''<br />
** Format: <code>OPT|[menu label]</code><br />
** Sent by the GVHUD when a menu item is selected. Sent on every selection, including when switching to a submenu.<br />
** [menu label] is the label of the selected menu item.<br />
* '''RFR'''<br />
** Format: <code>RFR</code><br />
** Sent by the GVHUD when it is ready to accept '''TXT''' commands. Vehicle should start sending '''TXT''' commands once it receives '''RFR''' after '''CON'''.<br />
* '''BTN'''<br />
** Format: <code>BTN|[button index]|[button ID]|[state]</code><br />
** Sent by the GVHUD when a button is pressed or released.<br />
** [button index] is the index of the button in the button arrays, 0 to 29.<br />
** [button ID] is the button ID from the table below.<br />
** [state] is 0 for off or 1 for on.<br />
* '''GST'''<br />
** Format: <code>GST|[command]</code><br />
** Sent by the GVHUD when a gesture hotkey is used.<br />
** [command] can be one of the commands described in Gesture Controls below.<br />
* '''SRN'''<br />
** Format: <code>SRN|[sound UUID]</code><br />
** Sent by the GVHUD ''directly to the siren emitter prim specified by '''ACK''' only'' to cause it to play a siren sound.<br />
** [sound UUID] is a sound to play, or NULL_KEY to stop sounds.<br />
* '''SST'''<br />
** Format: <code>SST|[siren state]</code><br />
** Sent by the GVHUD when the siren mode changed. If multiple GVHUDs are attached, the vehicle should send '''SSS''' to the other GVHUD.<br />
** [siren state] is the state of the siren.<br />
* '''SWS'''<br />
** Format: <code>SWS|[switch state]</code><br />
** Sent by the GVHUD when the switch is moved. If multiple GVHUDs are attached, the vehicle should send '''SWU''' to the other GVHUD.<br />
* '''CON'''<br />
** Format: <code>CON</code><br />
** Sent by the GVHUD when it is attached/reset, or in response to '''SYN'''.<br />
<br />
===Siren Interface===<br />
If a siren is used, two prims must be designated as siren sound emitter prims. Their UUIDs should be detected and sent in '''ACK'''.<br />
<br />
To reduce latency, the GVHUD sends '''SRN''' commands directly to the prims designated by '''ACK'''. Each prim must listen for '''SRN''' independently of the script that handles other GVHUD communication, and should play siren sounds as sent by the GVHUD. A sample script is below, which should be placed in each of the prims designated as siren emitter prims:<br />
<br />
default<br />
{<br />
state_entry()<br />
{<br />
llListen(-47504750, "", "", "");<br />
}<br />
listen(integer channel, string name, key id, string message)<br />
{<br />
if (llGetSubString(message, 0, 3) == "SRN|" && id == hud_uuid)<br />
{<br />
string uuid = llGetSubString(message, 4, -1);<br />
if (uuid == NULL_KEY) llStopSound();<br />
else llLoopSound(uuid, 1.0);<br />
}<br />
}<br />
}<br />
<br />
Sound emitter scripts must verify that the object that sent the '''SRN''' command is the connected GVHUD. This script snippet does not define <code>hud_uuid</code>; it must be set when the script that controls GVHUD communication sends '''ACK''' so that the emitter knows the UUID of the connected GVHUD.<br />
<br />
===Gesture Controls===<br />
The gestures provided in the GVHUD send the following internal commands:<br />
<br />
* '''F2''': "ZF2", resizes GVHUD.<br />
* '''F3''': "ZF3", toggles axle lock (button ID 28), if equipped, otherwise ignored.<br />
* '''F4''': "ZF4", cycles through hands-free siren tones, if eqipped, otherwise ignored.<br />
* '''F5''': "ZF5", moves switch to position 0.<br />
* '''F6''': "ZF6", moves switch to position 1.<br />
* '''F7''': "ZF7", moves switch to position 2.<br />
* '''F8''': "ZF8", moves switch to position 3.<br />
* '''Ctrl + Left''': "ZCA", toggles turn L (button ID 24), if equipped, otherwise ignored.<br />
* '''Ctrl + Right''': "ZCD", toggles turn L (button ID 29), if equipped, otherwise ignored.<br />
* '''Ctrl + Down''': "ZCS", toggles hazards (button ID 25), if equipped, otherwise ignored.<br />
* '''H''': "ZZH", horn tap, sends <code>GST|HORN</code>.<br />
* '''L''': "ZZL", toggles cycle headlights (button ID 26), if equipped, otherwise ignored.<br />
* '''K''': "ZZK", high beams flash, sends <code>GST|BRIGHT</code>.<br />
* '''I''': "ZZI", toggles key (button ID 7), if equipped, otherwise ignored.<br />
* '''O''': "ZZO", get out, sends <code>GST|OUT</code>.<br />
* '''Space''': "ZZ_", handbrake, sends <code>GST|BRAKE</code>.<br />
* '''1''': "ZZ1", camera 1, sends <code>GST|CAM1</code>.<br />
* '''2''': "ZZ2", camera 2, sends <code>GST|CAM2</code>.<br />
* '''3''': "ZZ3", camera 3, sends <code>GST|CAM3</code>.<br />
* '''4''': "ZZ4", camera 4, sends <code>GST|CAM4</code>.<br />
* '''5''': "ZZ5", camera 5, sends <code>GST|CAM5</code>.<br />
* '''6''': "ZZ6", camera 6, sends <code>GST|CAM6</code>.<br />
<br />
===Button IDs===<br />
The following is a list of available button IDs.<br />
<br />
This list can be expanded by the NTBI Group without a GVHUD update. If you have a button label you would like to be integrated into the GVHUD's available buttons, contact Nelson Jenkins.<br />
<br />
{| class="wikitable"<br />
|-<br />
! ID || Description || ID || Description || ID || Description || ID || Description<br />
|-<br />
| -10 || Siren Wail* || -11 || Siren Yelp* || -12 || Siren Priority* || -13 || Siren Manual*<br />
|-<br />
| -14 || Siren Horn* || -1 || Blank || || || || <br />
|-<br />
| 0 || LIGHT BAR (Red) || 1 || STRB (Red) || 2 || TKDN FLASH (Red) || 3 || TAKE DOWN (Red)<br />
|-<br />
| 4 || FLOOD (Red) || 5 || CRZ (Red) || 6 || (Reserved) || 7 || Key (Green)<br />
|-<br />
| 8 || HIDE AWAY (Red) || 9 || WIG WAG (Red) || 10 || Arrow (Red) || 11 || Siren Wail*<br />
|-<br />
| 12 || Siren Yelp* || 13 || Siren Priority* || 14 || Siren Manual* || 15 || Siren Horn*<br />
|-<br />
| 16 || AUX 1 || 17 || AUX 2 || 18 || AUX 3 || 19 || CUT F (Red)<br />
|-<br />
| 20 || CUT R (Red) || 21 || (Reserved) || 22 || (Reserved) || 23 || (Reserved)<br />
|-<br />
| 24 || Turn Sig L || 25 || Cycle Headlights || 26 || Hazard Flashers || 27 || Horn<br />
|-<br />
| 28 || Axle Lock || 29 || Turn Sig R || || || || <br />
|}<br />
<br />
<nowiki>*</nowiki> Use negative button IDs for GVHUD to handle the siren. The GVHUD will automatically pick the correct buttons to show, will only allow one on at a time, and will send siren commands directly to the prims specified in SSU. Use positive button IDs for sirens only if you want them to send BTN commands and not be connected together.</div>NelsonJenkinshttps://wiki.ntbigroup.com/index.php?title=Global_Mod_Link_System&diff=2941Global Mod Link System2021-04-04T02:58:15Z<p>NelsonJenkins: Created page with "The '''Global Mod Link System (GMLS)''' is a free, full-permission script system provided by the NTBI Group. Anyone can implement GMLS into their modifiable vehicle, and anyon..."</p>
<hr />
<div>The '''Global Mod Link System (GMLS)''' is a free, full-permission script system provided by the NTBI Group. Anyone can implement GMLS into their modifiable vehicle, and anyone can build mods that automatically position themselves when linked to a GMLS-compatible vehicle.<br />
<br />
==Overview==<br />
GMLS is a set of full-permissions scripts. It is intended for use in modifiable vehicles to simplify the installation of prebuilt modifications. For example, the NTBI Factory Lightbar Package uses GMLS to automatically position lightbars when linked to compatible vehicles.<br />
<br />
Aftermarket modification manufacturers can set up GMLS by linking a copy of the modification to the desired vehicle and using the Calibration Tool to set up the Alignment Tool. Then, when an end-user links the modification to a compatible vehicle, the modification will reposition itself (and, if necessary, rescale itself) automatically. GMLS can also unlink certain prims from the vehicle for factory prim replacements.<br />
<br />
GMLS comes with three scripts:<br />
<br />
* '''NTBI GMLS Alignment Tool''' - Inserted into aftermarket modifications and edited by the modification manufacturer to program alignment positions and other options.<br />
* '''NTBI GMLS Calibration Tool''' - Used to calibrate alignment positions; outputs alignment data to be placed in the Alignment Tool.<br />
* '''NTBI GMLS Vehicle Sample Script''' - Inserted into vehicles and edited by the vehicle manufacturer to define vehicle information for use by modifications.<br />
<br />
The NTBI Group does not maintain a list of compatible vehicles or modifications. GMLS-compatible products should clearly label themselves as such. The NTBI Group does not provide any warranty for third-party GMLS implementations.<br />
<br />
<big>[https://marketplace.secondlife.com/p/GMLS-Development-Kit-Tools-for-Integrating-the-Global-Mod-Link-System/20803262 '''Click here''' for the GMLS developer kit.]</big><br />
<br />
==End-User Instructions==<br />
Refer to your vehicle's owner's guide for instructions on how to install GMLS-compatible equipment.<br />
<br />
If the owner's guide does not provide instructions, the following is a general checklist for installing GMLS-compatible modifications:<br />
<br />
# Ensure that the vehicle is turned off, including any lighting or other components that may change any attributes while installing the modification.<br />
# Take a copy of your vehicle as-is. Modifications may cause damage or unlink prims accidentally. Save a copy now in case this happens!<br />
# Rez the modification near your vehicle.<br />
# Right click the modification and select "Edit".<br />
# With the Edit window open, hold your SHIFT key and left click the vehicle. This should select both objects at once. Make sure you select the vehicle last.<br />
# Press your CTRL + L keys, or click the "Link" button in the Edit window.<br />
# If prompted, confirm that you want to link the two objects together.<br />
# When linked, the modification should automatically position itself to the recommended position and resize if necessary.<br />
# If prompted, grant link permissions. This may unlink some prims. Make sure to delete them after.<br />
# If desired, you may usually move the equipment once linked.<br />
<br />
If a modification does not use GMLS, is not compatible with your vehicle's GMLS system, or returns an error when linking using the above procedure, follow steps 1 through 6, then manually reposition the modification as needed.<br />
<br />
==Aftermarket Modification Manufacturer Instructions==<br />
Get the Alignment Tool and Calibration Tool from the [https://marketplace.secondlife.com/p/GMLS-Development-Kit-Tools-for-Integrating-the-Global-Mod-Link-System/20803262 GMLS developer kit.]<br />
<br />
Before continuing, make sure your mod is finished. Do not continue until you are sure you do not need to make any changes to your object.<br />
<br />
# Make a two copies of your object. One will be used for calibration. The other will be distributed to your end-users.<br />
# Place the "NTBI GMLS Alignment Tool" script in the distribution object (the one you will keep).<br />
# Place the "NTBI GMLS Calibration Tool" script in the calibration object (the one you will link, then delete).<br />
<br />
For each vehicle you want your object to be compatible with:<br />
<br />
# Make a new copy of the calibration object. It should have the "NTBI GMLS Calibration Tool" script already in it.<br />
# Rez the vehicle. Make sure it is the original size!<br />
# Position the calibration object on the vehicle, exactly where you want it to be once installed by the end-user.<br />
# Link the calibration object to the vehicle.<br />
# Copy the script snippet line sent to local chat.<br />
# Open the "NTBI GMLS Alignment Tool" script in the distribution object.<br />
# Paste the script snippet line between the two marked lines at the top of the script. NOTE: The first part of each line is the GMLS ID of the vehicle you have calibrated to. If you see a line with the same GMLS ID, you have already calibrated to that vehicle, and only the first instance of that vehicle will be used.<br />
# Save the "NTBI GMLS Alignment Tool" script.<br />
<br />
Once finished, delete any calibration objects and vehicles.<br />
<br />
If you want the root prim of the object to retain its physics type when linked to the vehicle, change root_no_physics to FALSE. (By default, the root prim of this object will be set to physics type "none" and the physics types of child prims will remain the same.)<br />
<br />
If you want to have the GMLS script automatically unlink prims, list their names in the remove_prims list. If you do this, you can also change remove_move_dist to change the distance unlinked prims will move up, and you can change remove_recolor to FALSE if you do not want unlinked prims to be recolored bright red for visibility.<br />
<br />
When finished, make sure you test your modification on each compatible vehicle to make sure it works correctly.<br />
<br />
==Vehicle Manufacturer Instructions==<br />
Get the Alignment Tool and Calibration Tool from the [https://marketplace.secondlife.com/p/GMLS-Development-Kit-Tools-for-Integrating-the-Global-Mod-Link-System/20803262 GMLS developer kit.]<br />
<br />
Before continuing, make sure your vehicle's root prim will not be resized before it is distributed. Do not continue until the root prim is finalized.<br />
<br />
# Place the "NTBI GMLS Vehicle Sample Script" script in the vehicle. If you prefer, you can also integrate this script into another script in the vehicle to save memory.<br />
# Edit the gmls_id string. You can use any string as long as it does not include the pipe ("|") character, but it should be limited to alphanumeric characters, underscores ("_"), and be up to 32 characters. The gmls_id must be unique for every vehicle that has a different layout of potential modification positions. For example, use different IDs for 2DR and 4DR variations of the same vehicle.<br />
# Edit the gmls_default_root_size vector to be the size of the root prim of the vehicle. On most viewers, you can get this value by opening the Edit window, going to the Object tab, and pushing the "C" button next to Size. WARNING: This is not optional. Failure to set this value will cause GMLS modifications to align improperly.<br />
# Save the "NTBI GMLS Vehicle Sample Script" script. If kept separate, you can [http://wiki.secondlife.com/wiki/LlSetMemoryLimit limit the memory used by the script] if you prefer.<br />
<br />
Perform this procedure for each vehicle variation. Once finished, it is a good idea to test the GMLS settings by creating a simple object and following the Aftermarket Modification Manufacturer Instructions.</div>NelsonJenkinshttps://wiki.ntbigroup.com/index.php?title=Global_License_Plate_System&diff=2940Global License Plate System2021-04-04T02:57:56Z<p>NelsonJenkins: Created page with "The '''Global License Plate System (GLPS)''' is a free, open-source license plate system maintained by the NTBI Group. Anyone can attach a GLPS license plate onto their own ve..."</p>
<hr />
<div>The '''Global License Plate System (GLPS)''' is a free, open-source license plate system maintained by the NTBI Group. Anyone can attach a GLPS license plate onto their own vehicle and sell their vehicle with GLPS license plates installed.<br />
<br />
==Overview==<br />
GLPS is the combination of a full-permissions model, script, PSD files, and web API. While designed for vehicle manufacturers, GLPS plates can be installed on any modifiable vehicle by simply linking them to the vehicle object.<br />
<br />
GLPS is designed to overcome formatting issues with license plates previously used on NTBI vehicles and those created by some other manufacturers. On those models, characters shown on the plate had to be displayed where the individual character faces were positioned on the model. Instead, GLPS uses an innovative text rendering technique that allows characters to be displayed effectively anywhere on the plate at any size while still using only one texture per font. This also allows GLPS plates to be resized automatically between US/Japan and UK/Euro sizes without needing to duplicate the entire plate for another size, because fonts can be changed and characters can be moved and scaled appropriately for each plate size and design.<br />
<br />
<big>[https://marketplace.secondlife.com/p/GLPS-Development-Kit-Full-Perm-Global-License-Plate-System-Plate/20803261 '''Click here''' for the GLPS developer kit.]</big><br />
<br />
<big>[https://ntbigroup.com/TEMPLATES/GLPS%20TEMPLATE%20JP%20US.psd '''Click here''' for the GLPS JP/US sized custom texture PSD.]</big><br />
<br />
<big>[https://ntbigroup.com/TEMPLATES/GLPS%20TEMPLATE%20EU%20RU%20UK.psd '''Click here''' for the GLPS EU/RU/UK sized custom texture PSD.]</big><br />
<br />
<big>For a list of default templates, scroll to the bottom of the page.</big><br />
<br />
==Compatible Vehicles==<br />
GLPS is being integrated into NTBI vehicles on a rolling basis. However, since GLPS is a free standard, other manufacturers may also implement GLPS on their vehicles.<br />
<br />
==Instructions==<br />
GLPS is very simple to install and use - see the instructions below.<br />
<br />
===For End-Users===<br />
Each manufacturer implements GLPS differently, so refer to your vehicle's owners guide.<br />
<br />
Most vehicles allow you to set a plate by navigating the vehicle's configuration menu.<br />
<br />
If you are developing your own vehicle, or for some reason you cannot access the GLPS configuration menu, drop the ''NTBI GLPS Configuration Tool'' script into the vehicle. It will send the command to open the GLPS configuration menu and immediately delete itself.<br />
<br />
===For Vehicle Developers===<br />
Follow the instructions at the top of the script inside the plate to set it up for your vehicle.<br />
<br />
GLPS plates can be configured two ways - either by sending a command that causes the plate to send the user the GLPS configuration menu, or by sending configuration information directly to the plate.<br />
<br />
To trigger the GLPS configuration menu for the owner, use:<br />
<br />
llMessageLinked(LINK_SET, 0, "GLPS_OPEN_MENU", "");<br />
<br />
To set the plate number, use:<br />
<br />
llMessageLinked(LINK_SET, 0, "GLPS_SET_NUMBER", "[plate number]");<br />
<br />
To load a template directly, use:<br />
<br />
llMessageLinked(LINK_SET, 0, "GLPS_LOAD_TEMPLATE", "[template code]");<br />
<br />
To request the current GLPS config, use:<br />
<br />
llMessageLinked(LINK_SET, 0, "GLPS_GET_DATA", "");<br />
<br />
This will return:<br />
<br />
llMessageLinked(LINK_SET, 0, "GLPS_GOT_DATA", "[JSON object of GLPS config]");<br />
<br />
To load a GLPS config, use:<br />
<br />
llMessageLinked(LINK_SET, 0, "GLPS_LOAD_DATA", "[JSON object of GLPS config]");<br />
<br />
You may also want to set the current template ID using:<br />
<br />
llMessageLinked(LINK_SET, 0, "GLPS_SET_TEMPLATE_ID", "[template code]");<br />
<br />
Note that this will not actually load the template, but can be used to force the template code into memory.<br />
<br />
===For Roleplay Managers and Other Developers===<br />
GLPS plates can be "read" using a chat command, which facilitates simulated ALPR cameras. Communication to the plate is performed on a pseudo-random channel, and communication back to the reader is sent on channel 2250. The command is as follows:<br />
<br />
key vehicle_key = llDetectedKey(0); // this key can be obtained any way you want<br />
llRegionSay((integer)("0x" + llGetSubString((string)vehicle_key, -7, -1)), "GLPS_SCAN|" + (string)vehicle_key);<br />
<br />
The response, sent to channel 2250, will be:<br />
<br />
GLPS_SCANNED|[vehicle_key]|[template code]|[plate number]<br />
<br />
<code>[template code]</code> is the code of the default template, if used. If the plate has any modifications, or is using a custom code, <code>[template code]</code> will be "XXXXX".<br />
<br />
==Frequently Asked Questions==<br />
<br />
=====Can I change the number on my plate?=====<br />
<br />
Yes. Open the GLPS configuration menu and select ''Number...'', then enter your desired number. Note that for some plates, such as the default Second Life US-style plate, only a specific number of characters can be entered.<br />
<br />
=====Can I change the plate design/template to something else?=====<br />
<br />
Yes. Open the GLPS configuration menu and select ''Templates...'' -> ''Load...'', then enter the template code of the template you want to use. The template code will load a plate texture, layout, and font. Scroll down for a list of public template codes.<br />
<br />
=====Can I use my own plate textures?=====<br />
<br />
Yes. Open the GLPS configuration menu and select ''Templates...'' -> ''Customize...'' -> ''Texture...'', then paste the texture UUID in the text box. Then, if prompted, select whether you want to apply that texture to the ''Front'', ''Back'', or ''Both'' plates. Then select ''Layout...'' and apply a default layout or change the layout as needed to fit the texture. Then, if desired, select ''Font...'' and select your desired font.<br />
<br />
=====My plate texture already has numbers on it, can I still use it?=====<br />
<br />
Yes. Open the GLPS configuration menu and select ''Number...'' -> ''Clear Number'', then follow the instructions above to use a custom texture UUID.<br />
<br />
=====Why does my plate use an invalid combination of letters and numbers for my state/country? <br>Why does the Japanese plate not use only numbers? <br>Why does the hiragana character on the Japanese plate not match the vehicle type?=====<br />
<br />
Due to how GLPS works, plates are issued semi-randomly using both letters and numbers regardless of whether that would be an appropriate combination in real life for each jurisdiction and vehicle type. If you like, you can change the number to something appropriate.<br />
<br />
=====My country isn't included among the default templates, how do I add it?=====<br />
<br />
Download the PSD file and design a template in Photoshop, or use someone else's template.<br />
<br />
Note that GLPS plates are limited to 7 characters, so some plates (such as those issued in Russia) cannot be rendered fully.<br />
<br />
Note also that characters on GLPS plates are flexible but generally cannot be made small enough to be stacked on top of each other, as seen on certain US specialty plates. Therefore, if you are making a specialty plate template that uses two characters stacked on top of each other, we recommend that you include those characters directly on the template if possible.<br />
<br />
Finally, keep in mind that GLPS can only display 0-9, A-Z, certain Japanese hiragana (see below), and the following special characters: -.: GLPS cannot display registration or inspection stickers, other special characters, or non-English characters.<br />
<br />
If you design a real-life plate template that is not in the default templates, send an IM to Nelson Jenkins and we will review it to see if it would be appropriate to add to the default templates. Note that we will only add templates that are effectively identical to real-life plates.<br />
<br />
=====Why do you call them "license plates" and not "registration plates" or "number plates"?=====<br />
<br />
Because the person who developed GLPS is an American. Sorry.<br />
<br />
=====What plate sizes are available?=====<br />
<br />
GLPS includes, by default, 12x6 inch (305x152 mm) plates for Japan/US and 520x130 mm plates for Europe/Russia/UK. Other sizes may be available for specific jurisdictions, but these two sizes are the only ones that we provide PSDs for.<br />
<br />
Some trivia as to why the UK/Europe GLPS size is not accurate: all US states and Canadian provinces managed to agree on a reasonable, delightfully proportional 12x6 inch standard all the way back in 1956, which fits perfectly onto a 512x256 px texture. Europe, meanwhile, mostly uses 520x110 mm or 520x120 mm plates with horrendous 52:11 and 13:3 aspect ratios, with many countries using completely different sizes for no clear reason, including some even using the 12x6 inch format. Because of this, GLPS also bucks the trend with a "standard" 520x130 mm plate to facilitate the use of a 512x128 px texture.<br />
<br />
=====Are motorcycle plates available?=====<br />
<br />
While GLPS does not include any templates for smaller motorcycle plates, you may create your own using the PSD file and instructions above. However, it will be difficult if not impossible to render characters in two rows as seen on most European motorcycle plates due to technical limitations of the font textures.<br />
<br />
=====What information is stored by the GLPS web API?=====<br />
<br />
The GLPS API, hosted by Northbridge Business Systems, only stores the plate template (design only, no text) and plate owner's UUID when copying a plate template code. This data is not available to the public and is only used for detecting abuse of the template code generation service. This service is necessary because plate configurations are very long and are not easy to load into the plate manually. GLPS does not store any information about the vehicle, such as its position, speed, driver, or model, except for the vehicle owner's UUID as a consequence of storing the plate owner's UUID.<br />
<br />
=====Why is an NBS API key required?=====<br />
The GLPS API hosts saved plate data as described above. There is currently no limit to the number of plates any one person can save. To allow NBS to monitor the system for abuse, an NBS API key is required for calls that either read or store custom plate data.<br />
<br />
=====How are default plate numbers assigned?=====<br />
<br />
Plate numbers are generated as seven-digit strings, and if the plate template cannot display seven digits, only the first digits are displayed up to the maximum. The first two characters are random alphanumeric characters, the third character is the first character of the region name that the car is first rezzed in, the fourth through sixth characters are the last three digits of the current Unix timestamp, and the last character is a random alphanumeric character.<br />
<br />
=====Are plate numbers unique or searchable?=====<br />
<br />
No. Due to privacy concerns, we chose to make plate numbers pseudo-random and they might not be unique. However, plate numbers only change when the vehicle owner changes or the plate is edited by the user, so plate numbers will persist even if the vehicle is taken and re-rezzed.<br />
<br />
=====Why is the layout/font not accurate for my state/country?=====<br />
<br />
We have tried to implement as many plate designs as we could, but the person who developed GLPS is a stupid American, so many of the European plates are wrong because we do not have access to every accurate font, and we do not have the time to make sure every state plate is pixel-perfect. Different states and countries use a wide variety of fonts, layouts, decals, additional stickers, and sizes. We have attempted to emulate these formats, but the layout and font may not be completely accurate in every case.<br />
<br />
=====For European plates with inspection stickers, can they be changed?=====<br />
<br />
While you are welcome to make your own inspection sticker, the sticker on the template is the only inspection sticker possible by default. We have thus attempted to avoid referring to any specific year on the default templates.<br />
<br />
=====For Russian plates, can the region number be changed to not say "SL"?=====<br />
<br />
No. Due to the fact that GLPS can only render 7 characters, the region code was replaced with "SL", but you can edit the default template to set a custom region number if you like.<br />
<br />
=====What does the Japanese plate say at the top?=====<br />
<br />
The kanji at the top reads "import" and the number to the right is the vehicle class code, which is estimated depending on the plate type you use, but can be edited (see above). Realistically, the kanji would indicate the local office that issued the plate, but incorporating all of the possible office codes would make the characters unreadable. For more information, [https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Japan see the relevant Wikipedia article.] It is also possible that the kanji reads something totally nonsensical or that we glossed over an appropriate real-life alternative that could have been used, since the person who developed GLPS is a baka gaijin.<br />
<br />
=====For Japanese plates, can I change the issuing office and class codes at the top of the plate?=====<br />
<br />
Yes, but this can only be done by making your own texture using the PSD file in Photoshop. Due to Second Life limitations, only the hiragana character and sequential digits can be changed in-world.<br />
<br />
=====For Japanese plates, how do I display dots instead of leading zeroes?=====<br />
<br />
Use ":" (the colon punctuation mark) for each centered dot.<br />
<br />
=====For Japanese plates, how do I enter the hiragana character?=====<br />
<br />
GLPS will accept hiragana in the number input. Alternatively, you can use the following romanji and punctuation that are mapped to the following hiragana:<br />
<br />
{| class="wikitable" style="text-align:center;"<br />
|-<br />
! 0 || 1 || 2 || 3 || 4 || 5 || 6 || 7 || 8 || 9 || A || B || C || D || E || F || G || H || I || J<br />
|-<br />
| さ || す || せ || そ || た || ち || つ || て || と || な || に || ぬ || ね || の || は || ひ || ふ || ほ || ま || み<br />
|-<br />
! K || L || M || N || O || P || Q || R || S || T || U || V || W || X || Y || Z || - || . || : || @<br />
|-<br />
| む || め || も || や || ゆ || よ || ら || り || る || ろ || あ || い || う || え || か || き || く || け || こ || を<br />
|}<br />
<br />
Note that the hiragana mapped to 0-9 and A-T are used on private vehicles and those mapped to U-Z and punctuation are used on commercial vehicles, though due to the nature of GLPS, these combinations are not always accurate. Also, GLPS does not support the れ and わ "rental vehicle" hiragana due to space limitations, and does not support any of the following hiragana not valid on license plates: 'ばだがぱざびぢぎぴじぶづぐぷずべでげペぜぼどごぽぞゑゐ<br />
<br />
=====What are the default templates?=====<br />
<br />
Below is a list of default template codes:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Code || Size || Digits || Description<br />
|-<br />
| GLPSD/SLUSS || JP/US || 6 || Second Life Default (US Style)<br />
|-<br />
| GLPSD/SLUSV || JP/US || 1-7 || Second Life Vanity (US Style)<br />
|-<br />
| GLPSD/SLMBE || JP/US || 1-7 || Second Life Mainland - Bellisseria<br />
|-<br />
| GLPSD/SLMBS || JP/US || 1-7 || Second Life Mainland - Blake Sea<br />
|-<br />
| GLPSD/SLMCO || JP/US || 1-7 || Second Life Mainland - Corsica<br />
|-<br />
| GLPSD/SLMGI || JP/US || 1-7 || Second Life Mainland - Gaeta Islands<br />
|-<br />
| GLPSD/SLMHE || JP/US || 1-7 || Second Life Mainland - Heterocera<br />
|-<br />
| GLPSD/SLMJE || JP/US || 1-7 || Second Life Mainland - Jeogeot<br />
|-<br />
| GLPSD/SLMNA || JP/US || 1-7 || Second Life Mainland - Nautilus<br />
|-<br />
| GLPSD/SLMSA || JP/US || 1-7 || Second Life Mainland - Sansara<br />
|-<br />
| GLPSD/SLMST || JP/US || 1-7 || Second Life Mainland - Satori<br />
|-<br />
| GLPSD/SLMSC || JP/US || 1-7 || Second Life Mainland - Sharp Continent<br />
|-<br />
| GLPSD/SLMZI || JP/US || 1-7 || Second Life Mainland - Zindra<br />
|-<br />
| GLPSD/JPPSS || JP/US || 5 || Japan - Private<br />
|-<br />
| GLPSD/JPPKS || JP/US || 5 || Japan - Private Kei<br />
|-<br />
| GLPSD/JPCSS || JP/US || 5 || Japan - Commercial<br />
|-<br />
| GLPSD/JPCKS || JP/US || 5 || Japan - Commercial Kei<br />
|-<br />
| GLPSD/JPTPS || JP/US || 5 || Japan - Temporary<br />
|-<br />
| GLPSD/USCAS || JP/US || 1-7 || United States - California<br />
|-<br />
| GLPSD/USCAB || JP/US || 1-7 || United States - California (Black)<br />
|-<br />
| GLPSD/USNJS || JP/US || 6 || United States - New Jersey<br />
|-<br />
| GLPSD/USNJV || JP/US || 1-7 || United States - New Jersey Vanity<br />
|-<br />
| GLPSD/USNYS || JP/US || 7 || United States - New York<br />
|-<br />
| GLPSD/USNYV || JP/US || 1-7 || United States - New York Vanity<br />
|-<br />
| GLPSD/USNYA || JP/US || 7 || United States - New York (2010s)<br />
|-<br />
| GLPSD/USNYB || JP/US || 1-7 || United States - New York Vanity (2010s)<br />
|-<br />
| GLPSD/USNYC || JP/US || 1-7 || United States - New York Livery (2010s)<br />
|-<br />
| GLPSD/USNYD || JP/US || 1-7 || United States - New York T&LC (2010s)<br />
|-<br />
| GLPSD/USNYE || JP/US || 7 || United States - New York (2000s)<br />
|-<br />
| GLPSD/USNYF || JP/US || 1-7 || United States - New York Vanity (2000s)<br />
|-<br />
| GLPSD/USNYG || JP/US || 1-7 || United States - New York Livery (2000s)<br />
|-<br />
| GLPSD/USNYH || JP/US || 1-7 || United States - New York T&LC (2000s)<br />
|-<br />
| GLPSD/USNYI || JP/US || 6 || United States - New York (1990s)<br />
|-<br />
| GLPSD/USNYJ || JP/US || 6 || United States - New York Vanity (1990s)<br />
|-<br />
| GLPSD/USNYK || JP/US || 6 || United States - New York Livery (1990s)<br />
|-<br />
| GLPSD/USNYL || JP/US || 6 || United States - New York T&LC (1990s)<br />
|-<br />
| GLPSD/USNYM || JP/US || 6 || United States - New York Commercial (1990s)<br />
|-<br />
| GLPSD/USPAS || JP/US || 7 || United States - Pennsylvania<br />
|-<br />
| GLPSD/USPAV || JP/US || 1-7 || United States - Pennsylvania Vanity<br />
|-<br />
| GLPSD/USTXS || JP/US || 7 || United States - Texas<br />
|-<br />
| GLPSD/USTXV || JP/US || 1-7 || United States - Texas Vanity<br />
|-<br />
| GLPSD/SLEUS || EU/RU/UK || 1-7 || Second Life Default (EU Style)<br />
|-<br />
| GLPSD/EUALS || EU/RU/UK || 7 || Albania<br />
|-<br />
| GLPSD/EUAAS || EU/RU/UK || 6 || Austria<br />
|-<br />
| GLPSD/EUBYS || EU/RU/UK || 7 || Belarus<br />
|-<br />
| GLPSD/EUBBS || EU/RU/UK || 7 || Belgium<br />
|-<br />
| GLPSD/EUBIS || EU/RU/UK || 7 || Bosnia and Herzegovina<br />
|-<br />
| GLPSD/EUBGS || EU/RU/UK || 7 || Bulgaria<br />
|-<br />
| GLPSD/EUHRS || EU/RU/UK || 7 || Croatia<br />
|-<br />
| GLPSD/EUCZS || EU/RU/UK || 7 || Czech Republic<br />
|-<br />
| GLPSD/EUDKS || EU/RU/UK || 7 || Denmark<br />
|-<br />
| GLPSD/EUDKC || EU/RU/UK || 7 || Denmark - Commercial<br />
|-<br />
| GLPSD/EUDKP || EU/RU/UK || 7 || Denmark - "Parrot"<br />
|-<br />
| GLPSD/EUESS || EU/RU/UK || 6 || Estonia<br />
|-<br />
| GLPSD/EUFIS || EU/RU/UK || 6 || Finland<br />
|-<br />
| GLPSD/EUFFS || EU/RU/UK || 7 || France<br />
|-<br />
| GLPSD/EUDDS || EU/RU/UK || 7 || Germany<br />
|-<br />
| GLPSD/EUGRS || EU/RU/UK || 7 || Greece<br />
|-<br />
| GLPSD/EUHHS || EU/RU/UK || 6 || Hungary<br />
|-<br />
| GLPSD/EUISS || EU/RU/UK || 5 || Iceland<br />
|-<br />
| GLPSD/EUIRS || EU/RU/UK || 7 || Ireland<br />
|-<br />
| GLPSD/EUIIS || EU/RU/UK || 7 || Italy<br />
|-<br />
| GLPSD/EULVS || EU/RU/UK || 6 || Latvia<br />
|-<br />
| GLPSD/EULIS || EU/RU/UK || 7 || Liechtenstein<br />
|-<br />
| GLPSD/EULTS || EU/RU/UK || 6 || Lithuania<br />
|-<br />
| GLPSD/EULLS || EU/RU/UK || 6 || Luxembourg<br />
|-<br />
| GLPSD/EUMMS || EU/RU/UK || 6 || Malta<br />
|-<br />
| GLPSD/EUMDS || EU/RU/UK || 6 || Moldova<br />
|-<br />
| GLPSD/EUMNS || EU/RU/UK || 7 || Montenegro<br />
|-<br />
| GLPSD/EUNLS || EU/RU/UK || 6 || Netherlands<br />
|-<br />
| GLPSD/EUNMS || EU/RU/UK || 7 || North Macedonia<br />
|-<br />
| GLPSD/EUNNS || EU/RU/UK || 7 || Norway<br />
|-<br />
| GLPSD/EUPLS || EU/RU/UK || 7 || Poland<br />
|-<br />
| GLPSD/EUPPS || EU/RU/UK || 6 || Portugal<br />
|-<br />
| GLPSD/EUROS || EU/RU/UK || 7 || Romania<br />
|-<br />
| GLPSD/EUSRS || EU/RU/UK || 7 || Serbia<br />
|-<br />
| GLPSD/EUSKS || EU/RU/UK || 7 || Slovakia<br />
|-<br />
| GLPSD/EUSLS || EU/RU/UK || 7 || Slovenia<br />
|-<br />
| GLPSD/EUEES || EU/RU/UK || 7 || Spain<br />
|-<br />
| GLPSD/EUSSS || EU/RU/UK || 6 || Sweden<br />
|-<br />
| GLPSD/EUUAS || EU/RU/UK || 7 || Ukraine<br />
|-<br />
| GLPSD/RURUS || EU/RU/UK || 6 || Russia<br />
|-<br />
| GLPSD/UKUKS || EU/RU/UK || 7 || United Kingdom (Front/Rear)<br />
|-<br />
| GLPSD/UKEUS || EU/RU/UK || 7 || United Kingdom EU (Front/Rear)<br />
|-<br />
| GLPSD/THPCS || Custom || 6 || Thailand - Private Car<br />
|-<br />
| GLPSD/THPVS || Custom || 6 || Thailand - Private Van<br />
|-<br />
| GLPSD/THPPS || Custom || 6 || Thailand - Private 2DR Pickup<br />
|-<br />
| GLPSD/THPTS || Custom || 6 || Thailand - Private Motorized Tricycle<br />
|-<br />
| GLPSD/THTCS || Custom || 6 || Thailand - Taxi<br />
|-<br />
| GLPSD/THSCS || Custom || 6 || Thailand - Service Vehicle<br />
|}<br />
<br />
=====What are the default fonts?=====<br />
<br />
Below is a list of default font codes:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Code || Description<br />
|-<br />
| US1 || United States - Generic 1<br />
|-<br />
| US2 || United States - Generic 2<br />
|-<br />
| USCA || United States - California<br />
|-<br />
| USFL || United States - Florida<br />
|-<br />
| USIL || United States - Illinois<br />
|-<br />
| USMA || United States - Massachusetts<br />
|-<br />
| USMD || United States - Maryland<br />
|-<br />
| USMI || United States - Michigan<br />
|-<br />
| USMO || United States - Missouri<br />
|-<br />
| USNC || United States - North Carolina<br />
|-<br />
| USNJ || United States - New Jersey<br />
|-<br />
| USNY || United States - New York<br />
|-<br />
| USOH || United States - Ohio<br />
|-<br />
| USPA || United States - Pennsylvania<br />
|-<br />
| USVA || United States - Virginia<br />
|-<br />
| USWA || United States - Washington<br />
|-<br />
| USWI || United States - Wisconsin<br />
|-<br />
| CAON || Canada - Ontario<br />
|-<br />
| CAQC || Canada - Quebec<br />
|-<br />
| UK || United Kingdom<br />
|-<br />
| EU1 || Europe - Generic 1<br />
|-<br />
| EU2 || Europe - Generic 2<br />
|-<br />
| EU3 || Europe - Generic 3<br />
|-<br />
| JPR || Japan - Romaji/Numerals<br />
|-<br />
| JPH || Japan - Hiragana<br />
|}</div>NelsonJenkinshttps://wiki.ntbigroup.com/index.php?title=IntelliDoor_Remote&diff=2939IntelliDoor Remote2021-04-04T02:57:14Z<p>NelsonJenkins: </p>
<hr />
<div>The IntelliDoor Remote is a remote controller for the [[IntelliDoor Garage]], [[IntelliDoor Bollard]], and [[IntelliDoor Gate]].<br />
<br />
==Setup==<br />
# Rez or wear the remote. The remote can be linked to a separate object (such as a sun visor in a car) if you wish.<br />
## For linking to SPT3 vehicles, use the GMLS version. The normal version will not resize correctly. For more information on GMLS, see [[Global Mod Link System]]. For all other uses, use the normal version.<br />
# Edit the _config notecard inside it and set password(s). To not use a button, leave its password blank.<br />
# Save the notecard and close it. The remote will load the notecard, and the indicator should flash slowly. Once extinguished, the remote is ready to use.<br />
<br />
==Config Values==<br />
* PASSWORD1, PASSWORD2, PASSWORD3: These are the IntelliDoor remote passwords for each button.<br />
* ACCESS: This is the base access setting. These people will be able to click the remote and use it if it is rezzed out. Can be "Everyone", "Group", or "Owner". If you are installing the remote on an SPT3 vehicle, leave this as "Owner".<br />
* WHITELIST: The list of people that will always be able to click the remote to operate it if it is rezzed. Separate with commas. '''NOTE: Whitelist names are ''usernames'' (nelson.jenkins, newbie), not ''legacy names'' (Nelson Jenkins, Newbie Resident).''' If you have more than 10 names, please read "Extended Whitelist" below.<br />
<br />
===Extended Whitelist===<br />
Because of LSL limitations, the whitelist line can only be read for 255 characters. However, the IntelliDoor system supports multiple whitelist lines. To be safe, separate your whitelist into 10-name increments, like so:<br><br />
<code>WHITELIST=User01, User02, User03, User04, User05, User06, User07, User08, User09, User10<br>WHITELIST=User11, User12, User13, User14</code><br><br />
You can have as many whitelist lines as you need.<br />
<br />
==SPT3 Vehicle Compatibility==<br />
As of v3.2, you can attach the IntelliDoor Remote to an SPT3 vehicle and it will automatically position itself on the edge of the driver's side sun visor. Additionally, it will always temporarily whitelist the current seated driver.<br />
<br />
==Updates & Release Notes==<br />
You can update your IntelliDoor Remote by simply rezzing or wearing it.<br />
* v3.2<br />
** Added GMLS and visor detection compatibility for SZYM Paladin 7.<br />
* v3.1<br />
** Primary public release.<br />
<br />
{{Gentek}}</div>NelsonJenkinshttps://wiki.ntbigroup.com/index.php?title=Templates&diff=2938Templates2021-03-21T02:55:57Z<p>NelsonJenkins: </p>
<hr />
<div>The following templates are available for NTBI products:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Product Name !! Diffuse (base) !! Normal (bumpmap) !! Specular (reflective)<br />
|-<br />
| [[Astaro Eastman]] || [https://ntbigroup.com/TEMPLATES/ASTARO/eastmanliverytemplate.psd Truck PSD]<br>[https://ntbigroup.com/TEMPLATES/ASTARO/boxtrailertemplate.psd Box Trailer PSD]<br>[https://ntbigroup.com/TEMPLATES/ASTARO/flatbedtrailertemplate.psd Flatbed Trailer PSD]<br>[https://ntbigroup.com/TEMPLATES/ASTARO/tankertrailertemplate.psd Tanker Trailer PSD] || N/A || N/A<br />
|-<br />
| [[Astaro Imperial]] || [https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIliverydecaltemplate.psd Livery Decal PSD] [https://wiki.ntbigroup.com/images/4/49/NTBIliverydecaltemplatePNG.png PNG] || N/A || N/A<br />
|-<br />
| [[Astaro LFT-30|Astaro LFT-30 Light Tank]] || [https://ntbigroup.com/TEMPLATES/TANKTEMPLATE1.psd Main PSD]<br>[https://ntbigroup.com/TEMPLATES/TANKTEMPLATE2.psd Details PSD] || N/A || N/A<br />
|-<br />
| [[Astaro Stratum]] || [https://ntbigroup.com/TEMPLATES/ASTARO/stratumoutsidetemplate.psd Main PSD]<br>[https://ntbigroup.com/TEMPLATES/ASTARO/pizzasign.psd Pizza Sign PSD]<br>[https://ntbigroup.com/TEMPLATES/ASTARO/tunerparts.psd Tuner Parts PSD] || N/A || N/A<br />
|-<br />
| [[TPF-1 Engine|Astaro TPF-1 Engine]] || [https://ntbigroup.com/TEMPLATES/FIRE/EngineFront1.psd Front PSD]<br>[https://ntbigroup.com/TEMPLATES/FIRE/EngineBack1.psd Rear PSD]<br>[https://wiki.ntbigroup.com/images/c/c9/Enginefrontdecal.png Front Decal PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG] || N/A || N/A<br />
|-<br />
| [[TPF-2 Tanker|Astaro TPF-2 Tanker]] || [https://ntbigroup.com/TEMPLATES/FIRE/TankerFront1.psd Front PSD]<br>[https://ntbigroup.com/TEMPLATES/FIRE/TankerBack1.psd Rear PSD]<br>[https://wiki.ntbigroup.com/images/c/c9/Enginefrontdecal.png Front Decal PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG] || N/A || N/A<br />
|-<br />
| [[TPF-3 Ladder|Astaro TPF-3 Ladder]] || [https://ntbigroup.com/TEMPLATES/FIRE/EngineFront1.psd Front PSD]<br>[https://ntbigroup.com/TEMPLATES/FIRE/LadderBack1.psd Rear PSD]<br>[https://wiki.ntbigroup.com/images/7/7e/Tankersidedecal.png Side Decal PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG] || N/A || N/A<br />
|-<br />
| [[TPF-4 Ambulance|Astaro TPF-4 Ambulance]] || [https://ntbigroup.com/TEMPLATES/FIRE/TPF4%20Template%20Front.psd Front PSD] [https://ntbigroup.com/TEMPLATES/FIRE/TPF4%20Template%20FrontGIMP.xcf XCF (GIMP)]<br>[https://ntbigroup.com/TEMPLATES/FIRE/TPF4%20Template%20Back.psd Rear PSD] [https://ntbigroup.com/TEMPLATES/FIRE/TPF4%20Template%20BackGIMP.xcf XCF (GIMP)] || N/A || N/A<br />
|-<br />
| [[Lusch Motors Allstar]] || [[Lusch Motors templates|See here]] || N/A || N/A<br />
|-<br />
| [[Lusch Motors]] (all others) || [https://luschmotors.weebly.com/ See here] || N/A || N/A<br />
|-<br />
| [[SZYM Entourage]] 6 || [https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Entourage%20v6%20Exterior%20Template.psd PSD] || [https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Entourage%20v6%20Normal%20Template.tga TGA] || [https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Entourage%20v6%20Specular%20Template.tga TGA]<br />
|-<br />
| [[SZYM Entourage]] (sculpted) || [https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIliverydecaltemplate.psd Livery Decal PSD] [https://wiki.ntbigroup.com/images/4/49/NTBIliverydecaltemplatePNG.png PNG] || N/A || N/A<br />
|-<br />
| [[SZYM Intruder]] 6 || [https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Intruder%20v6%20Exterior%20Template.psd PSD] || [https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Intruder%20v6%20Normal%20Template.tga TGA] || [https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Intruder%20v6%20Specular%20Template.tga TGA]<br />
|-<br />
| [[SZYM Intruder]] (sculpted) || [https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIliverydecaltemplate.psd Livery Decal PSD] [https://wiki.ntbigroup.com/images/4/49/NTBIliverydecaltemplatePNG.png PNG] || N/A || N/A<br />
|-<br />
| [[SZYM Tahari]] || [https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIliverydecaltemplate.psd Livery Decal PSD] [https://wiki.ntbigroup.com/images/4/49/NTBIliverydecaltemplatePNG.png PNG] || N/A || N/A<br />
|-<br />
| [[TR-50 Fire Helmet|Tredpro TR-50 Fire Helmet]] || [https://ntbigroup.com/TEMPLATES/platetextureexample.psd Front Plate PSD] [https://wiki.ntbigroup.com/images/0/07/Helmetplateexample.png PNG] || N/A || N/A<br />
|}<br />
<br />
For products not in this list, please refer to the owner's manual for template links.</div>NelsonJenkinshttps://wiki.ntbigroup.com/index.php?title=Templates&diff=2937Templates2021-03-21T02:55:14Z<p>NelsonJenkins: </p>
<hr />
<div>The following templates are available for NTBI products:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Product Name !! Diffuse (base) !! Normal (bumpmap) !! Specular (reflective)<br />
|-<br />
| [[Astaro Eastman]] || [https://ntbigroup.com/TEMPLATES/ASTARO/eastmanliverytemplate.psd Truck PSD]<br>[https://ntbigroup.com/TEMPLATES/ASTARO/boxtrailertemplate.psd Box Trailer PSD]<br>[https://ntbigroup.com/TEMPLATES/ASTARO/flatbedtrailertemplate.psd Flatbed Trailer PSD]<br>[https://ntbigroup.com/TEMPLATES/ASTARO/tankertrailertemplate.psd Tanker Trailer PSD] || N/A || N/A<br />
|-<br />
| [[Astaro Imperial]] || [https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIliverydecaltemplate.psd Livery Decal PSD] [https://wiki.ntbigroup.com/images/4/49/NTBIliverydecaltemplatePNG.png PNG] || N/A || N/A<br />
|-<br />
| [[Astaro LFT-30|Astaro LFT-30 Light Tank]] || [https://ntbigroup.com/TEMPLATES/TANKTEMPLATE1.psd Main PSD]<br>[https://ntbigroup.com/TEMPLATES/TANKTEMPLATE2.psd Details PSD] || N/A || N/A<br />
|-<br />
| [[Astaro Stratum]] || [https://ntbigroup.com/TEMPLATES/ASTARO/stratumoutsidetemplate.psd Main PSD]<br>[https://ntbigroup.com/TEMPLATES/ASTARO/pizzasign.psd Pizza Sign PSD]<br>[https://ntbigroup.com/TEMPLATES/ASTARO/tunerparts.psd Tuner Parts PSD] || N/A || N/A<br />
|-<br />
| [[Lusch Motors Allstar]] || [[Lusch Motors templates|See here]] || N/A || N/A<br />
|-<br />
| [[Lusch Motors]] (all others) || [https://luschmotors.weebly.com/ See here] || N/A || N/A<br />
|-<br />
| [[TPF-1 Engine|Astaro TPF-1 Engine]] || [https://ntbigroup.com/TEMPLATES/FIRE/EngineFront1.psd Front PSD]<br>[https://ntbigroup.com/TEMPLATES/FIRE/EngineBack1.psd Rear PSD]<br>[https://wiki.ntbigroup.com/images/c/c9/Enginefrontdecal.png Front Decal PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG] || N/A || N/A<br />
|-<br />
| [[TPF-2 Tanker|Astaro TPF-2 Tanker]] || [https://ntbigroup.com/TEMPLATES/FIRE/TankerFront1.psd Front PSD]<br>[https://ntbigroup.com/TEMPLATES/FIRE/TankerBack1.psd Rear PSD]<br>[https://wiki.ntbigroup.com/images/c/c9/Enginefrontdecal.png Front Decal PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG] || N/A || N/A<br />
|-<br />
| [[TPF-3 Ladder|Astaro TPF-3 Ladder]] || [https://ntbigroup.com/TEMPLATES/FIRE/EngineFront1.psd Front PSD]<br>[https://ntbigroup.com/TEMPLATES/FIRE/LadderBack1.psd Rear PSD]<br>[https://wiki.ntbigroup.com/images/7/7e/Tankersidedecal.png Side Decal PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG] || N/A || N/A<br />
|-<br />
| [[TPF-4 Ambulance|Astaro TPF-4 Ambulance]] || [https://ntbigroup.com/TEMPLATES/FIRE/TPF4%20Template%20Front.psd Front PSD] [https://ntbigroup.com/TEMPLATES/FIRE/TPF4%20Template%20FrontGIMP.xcf XCF (GIMP)]<br>[https://ntbigroup.com/TEMPLATES/FIRE/TPF4%20Template%20Back.psd Rear PSD] [https://ntbigroup.com/TEMPLATES/FIRE/TPF4%20Template%20BackGIMP.xcf XCF (GIMP)] || N/A || N/A<br />
|-<br />
| [[SZYM Entourage]] 6 || [https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Entourage%20v6%20Exterior%20Template.psd PSD] || [https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Entourage%20v6%20Normal%20Template.tga TGA] || [https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Entourage%20v6%20Specular%20Template.tga TGA]<br />
|-<br />
| [[SZYM Entourage]] (sculpted) || [https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIliverydecaltemplate.psd Livery Decal PSD] [https://wiki.ntbigroup.com/images/4/49/NTBIliverydecaltemplatePNG.png PNG] || N/A || N/A<br />
|-<br />
| [[SZYM Intruder]] 6 || [https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Intruder%20v6%20Exterior%20Template.psd PSD] || [https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Intruder%20v6%20Normal%20Template.tga TGA] || [https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Intruder%20v6%20Specular%20Template.tga TGA]<br />
|-<br />
| [[SZYM Intruder]] (sculpted) || [https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIliverydecaltemplate.psd Livery Decal PSD] [https://wiki.ntbigroup.com/images/4/49/NTBIliverydecaltemplatePNG.png PNG] || N/A || N/A<br />
|-<br />
| [[SZYM Tahari]] || [https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIliverydecaltemplate.psd Livery Decal PSD] [https://wiki.ntbigroup.com/images/4/49/NTBIliverydecaltemplatePNG.png PNG] || N/A || N/A<br />
|-<br />
| [[TR-50 Fire Helmet|Tredpro TR-50 Fire Helmet]] || [https://ntbigroup.com/TEMPLATES/platetextureexample.psd Front Plate PSD] [https://wiki.ntbigroup.com/images/0/07/Helmetplateexample.png PNG] || N/A || N/A<br />
|}<br />
<br />
For products not in this list, please refer to the owner's manual for template links.</div>NelsonJenkinshttps://wiki.ntbigroup.com/index.php?title=Templates&diff=2936Templates2021-03-21T02:52:00Z<p>NelsonJenkins: </p>
<hr />
<div>The following templates are available for NTBI products:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Product Name !! Diffuse (base) !! Normal (bumpmap) !! Specular (reflective)<br />
|-<br />
| [[Astaro Eastman]] || [https://ntbigroup.com/TEMPLATES/ASTARO/eastmanliverytemplate.psd Truck PSD]<br>[https://ntbigroup.com/TEMPLATES/ASTARO/boxtrailertemplate.psd Box Trailer PSD]<br>[https://ntbigroup.com/TEMPLATES/ASTARO/flatbedtrailertemplate.psd Flatbed Trailer PSD]<br>[https://ntbigroup.com/TEMPLATES/ASTARO/tankertrailertemplate.psd Tanker Trailer PSD] || N/A || N/A<br />
|-<br />
| [[Astaro Imperial]] || [https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIliverydecaltemplate.psd Livery Decal PSD] [https://wiki.ntbigroup.com/images/4/49/NTBIliverydecaltemplatePNG.png PNG] || N/A || N/A<br />
|-<br />
| [[Astaro LFT-30|Astaro LFT-30 Light Tank]] || [https://ntbigroup.com/TEMPLATES/TANKTEMPLATE1.psd Main PSD]<br>[https://ntbigroup.com/TEMPLATES/TANKTEMPLATE2.psd Details PSD] || N/A || N/A<br />
|-<br />
| [[Astaro Stratum]] || [https://ntbigroup.com/TEMPLATES/ASTARO/stratumoutsidetemplate.psd Main PSD]<br>[https://ntbigroup.com/TEMPLATES/ASTARO/pizzasign.psd Pizza Sign PSD]<br>[https://ntbigroup.com/TEMPLATES/ASTARO/tunerparts.psd Tuner Parts PSD] || N/A || N/A<br />
|-<br />
| [[Lusch Motors Allstar]] || [[Lusch Motors templates|See here]] || N/A || N/A<br />
|-<br />
| [[TPF-1 Engine|Astaro TPF-1 Engine]] || [https://ntbigroup.com/TEMPLATES/FIRE/EngineFront1.psd Front PSD]<br>[https://ntbigroup.com/TEMPLATES/FIRE/EngineBack1.psd Rear PSD]<br>[https://wiki.ntbigroup.com/images/c/c9/Enginefrontdecal.png Front Decal PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG] || N/A || N/A<br />
|-<br />
| [[TPF-2 Tanker|Astaro TPF-2 Tanker]] || [https://ntbigroup.com/TEMPLATES/FIRE/TankerFront1.psd Front PSD]<br>[https://ntbigroup.com/TEMPLATES/FIRE/TankerBack1.psd Rear PSD]<br>[https://wiki.ntbigroup.com/images/c/c9/Enginefrontdecal.png Front Decal PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG] || N/A || N/A<br />
|-<br />
| [[TPF-3 Ladder|Astaro TPF-3 Ladder]] || [https://ntbigroup.com/TEMPLATES/FIRE/EngineFront1.psd Front PSD]<br>[https://ntbigroup.com/TEMPLATES/FIRE/LadderBack1.psd Rear PSD]<br>[https://wiki.ntbigroup.com/images/7/7e/Tankersidedecal.png Side Decal PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG] || N/A || N/A<br />
|-<br />
| [[TPF-4 Ambulance|Astaro TPF-4 Ambulance]] || [https://ntbigroup.com/TEMPLATES/FIRE/TPF4%20Template%20Front.psd Front PSD] [https://ntbigroup.com/TEMPLATES/FIRE/TPF4%20Template%20FrontGIMP.xcf XCF (GIMP)]<br>[https://ntbigroup.com/TEMPLATES/FIRE/TPF4%20Template%20Back.psd Rear PSD] [https://ntbigroup.com/TEMPLATES/FIRE/TPF4%20Template%20BackGIMP.xcf XCF (GIMP)] || N/A || N/A<br />
|-<br />
| [[SZYM Entourage]] 6 || [https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Entourage%20v6%20Exterior%20Template.psd PSD] || [https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Entourage%20v6%20Normal%20Template.tga TGA] || [https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Entourage%20v6%20Specular%20Template.tga TGA]<br />
|-<br />
| [[SZYM Entourage]] (sculpted) || [https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIliverydecaltemplate.psd Livery Decal PSD] [https://wiki.ntbigroup.com/images/4/49/NTBIliverydecaltemplatePNG.png PNG] || N/A || N/A<br />
|-<br />
| [[SZYM Intruder]] 6 || [https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Intruder%20v6%20Exterior%20Template.psd PSD] || [https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Intruder%20v6%20Normal%20Template.tga TGA] || [https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Intruder%20v6%20Specular%20Template.tga TGA]<br />
|-<br />
| [[SZYM Intruder]] (sculpted) || [https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIliverydecaltemplate.psd Livery Decal PSD] [https://wiki.ntbigroup.com/images/4/49/NTBIliverydecaltemplatePNG.png PNG] || N/A || N/A<br />
|-<br />
| [[SZYM Tahari]] || [https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIliverydecaltemplate.psd Livery Decal PSD] [https://wiki.ntbigroup.com/images/4/49/NTBIliverydecaltemplatePNG.png PNG] || N/A || N/A<br />
|-<br />
| [[TR-50 Fire Helmet|Tredpro TR-50 Fire Helmet]] || [https://ntbigroup.com/TEMPLATES/platetextureexample.psd Front Plate PSD] [https://wiki.ntbigroup.com/images/0/07/Helmetplateexample.png PNG] || N/A || N/A<br />
|}<br />
<br />
For products not in this list, please refer to the owner's manual for template links.</div>NelsonJenkinshttps://wiki.ntbigroup.com/index.php?title=Templates&diff=2935Templates2021-03-21T02:51:51Z<p>NelsonJenkins: </p>
<hr />
<div>The following templates are available for NTBI products:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Product Name !! Diffuse (base) !! Normal (bumpmap) !! Specular (reflective)<br />
|-<br />
| [[Astaro Eastman]] || [https://ntbigroup.com/TEMPLATES/ASTARO/eastmanliverytemplate.psd Truck PSD]<br>[https://ntbigroup.com/TEMPLATES/ASTARO/boxtrailertemplate.psd Box Trailer PSD]<br>[https://ntbigroup.com/TEMPLATES/ASTARO/flatbedtrailertemplate.psd Flatbed Trailer PSD]<br>[https://ntbigroup.com/TEMPLATES/ASTARO/tankertrailertemplate.psd Tanker Trailer PSD] || N/A || N/A<br />
|-<br />
| [[Astaro Imperial]] || [https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIliverydecaltemplate.psd Livery Decal PSD] [https://wiki.ntbigroup.com/images/4/49/NTBIliverydecaltemplatePNG.png PNG] || N/A || N/A<br />
|-<br />
| [[Astaro LFT-30|Astaro LFT-30 Light Tank]] || [https://ntbigroup.com/TEMPLATES/TANKTEMPLATE1.psd Main PSD]<br>[https://ntbigroup.com/TEMPLATES/TANKTEMPLATE2.psd Details PSD] || N/A || N/A<br />
|-<br />
| [[Astaro Stratum]] || [https://ntbigroup.com/TEMPLATES/ASTARO/stratumoutsidetemplate.psd Main PSD]<br>[https://ntbigroup.com/TEMPLATES/ASTARO/pizzasign.psd Pizza Sign PSD]<br>[https://ntbigroup.com/TEMPLATES/ASTARO/tunerparts.psd Tuner Parts PSD] || N/A || N/A<br />
|-<br />
| [[Lusch Motors Allstar] || [[Lusch Motors templates|See here]] || N/A || N/A<br />
|-<br />
| [[TPF-1 Engine|Astaro TPF-1 Engine]] || [https://ntbigroup.com/TEMPLATES/FIRE/EngineFront1.psd Front PSD]<br>[https://ntbigroup.com/TEMPLATES/FIRE/EngineBack1.psd Rear PSD]<br>[https://wiki.ntbigroup.com/images/c/c9/Enginefrontdecal.png Front Decal PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG] || N/A || N/A<br />
|-<br />
| [[TPF-2 Tanker|Astaro TPF-2 Tanker]] || [https://ntbigroup.com/TEMPLATES/FIRE/TankerFront1.psd Front PSD]<br>[https://ntbigroup.com/TEMPLATES/FIRE/TankerBack1.psd Rear PSD]<br>[https://wiki.ntbigroup.com/images/c/c9/Enginefrontdecal.png Front Decal PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG] || N/A || N/A<br />
|-<br />
| [[TPF-3 Ladder|Astaro TPF-3 Ladder]] || [https://ntbigroup.com/TEMPLATES/FIRE/EngineFront1.psd Front PSD]<br>[https://ntbigroup.com/TEMPLATES/FIRE/LadderBack1.psd Rear PSD]<br>[https://wiki.ntbigroup.com/images/7/7e/Tankersidedecal.png Side Decal PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG] || N/A || N/A<br />
|-<br />
| [[TPF-4 Ambulance|Astaro TPF-4 Ambulance]] || [https://ntbigroup.com/TEMPLATES/FIRE/TPF4%20Template%20Front.psd Front PSD] [https://ntbigroup.com/TEMPLATES/FIRE/TPF4%20Template%20FrontGIMP.xcf XCF (GIMP)]<br>[https://ntbigroup.com/TEMPLATES/FIRE/TPF4%20Template%20Back.psd Rear PSD] [https://ntbigroup.com/TEMPLATES/FIRE/TPF4%20Template%20BackGIMP.xcf XCF (GIMP)] || N/A || N/A<br />
|-<br />
| [[SZYM Entourage]] 6 || [https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Entourage%20v6%20Exterior%20Template.psd PSD] || [https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Entourage%20v6%20Normal%20Template.tga TGA] || [https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Entourage%20v6%20Specular%20Template.tga TGA]<br />
|-<br />
| [[SZYM Entourage]] (sculpted) || [https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIliverydecaltemplate.psd Livery Decal PSD] [https://wiki.ntbigroup.com/images/4/49/NTBIliverydecaltemplatePNG.png PNG] || N/A || N/A<br />
|-<br />
| [[SZYM Intruder]] 6 || [https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Intruder%20v6%20Exterior%20Template.psd PSD] || [https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Intruder%20v6%20Normal%20Template.tga TGA] || [https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Intruder%20v6%20Specular%20Template.tga TGA]<br />
|-<br />
| [[SZYM Intruder]] (sculpted) || [https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIliverydecaltemplate.psd Livery Decal PSD] [https://wiki.ntbigroup.com/images/4/49/NTBIliverydecaltemplatePNG.png PNG] || N/A || N/A<br />
|-<br />
| [[SZYM Tahari]] || [https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIliverydecaltemplate.psd Livery Decal PSD] [https://wiki.ntbigroup.com/images/4/49/NTBIliverydecaltemplatePNG.png PNG] || N/A || N/A<br />
|-<br />
| [[TR-50 Fire Helmet|Tredpro TR-50 Fire Helmet]] || [https://ntbigroup.com/TEMPLATES/platetextureexample.psd Front Plate PSD] [https://wiki.ntbigroup.com/images/0/07/Helmetplateexample.png PNG] || N/A || N/A<br />
|}<br />
<br />
For products not in this list, please refer to the owner's manual for template links.</div>NelsonJenkinshttps://wiki.ntbigroup.com/index.php?title=Templates&diff=2934Templates2021-03-21T02:44:23Z<p>NelsonJenkins: </p>
<hr />
<div>The following templates are available for NTBI products:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Product Name !! Diffuse (base) !! Normal (bumpmap) !! Specular (reflective)<br />
|-<br />
| Astaro Imperial || [https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIliverydecaltemplate.psd Livery Decal PSD] [https://wiki.ntbigroup.com/images/4/49/NTBIliverydecaltemplatePNG.png PNG] || N/A || N/A<br />
|-<br />
| Astaro TPF-1 Engine || [https://ntbigroup.com/TEMPLATES/FIRE/EngineFront1.psd Front PSD]<br>[https://ntbigroup.com/TEMPLATES/FIRE/EngineBack1.psd Rear PSD]<br>[https://wiki.ntbigroup.com/images/c/c9/Enginefrontdecal.png Front Decal PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG] || N/A || N/A<br />
|-<br />
| Astaro TPF-2 Tanker || [https://ntbigroup.com/TEMPLATES/FIRE/TankerFront1.psd Front PSD]<br>[https://ntbigroup.com/TEMPLATES/FIRE/TankerBack1.psd Rear PSD]<br>[https://wiki.ntbigroup.com/images/c/c9/Enginefrontdecal.png Front Decal PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG] || N/A || N/A<br />
|-<br />
| Astaro TPF-3 Ladder || [https://ntbigroup.com/TEMPLATES/FIRE/EngineFront1.psd Front PSD]<br>[https://ntbigroup.com/TEMPLATES/FIRE/LadderBack1.psd Rear PSD]<br>[https://wiki.ntbigroup.com/images/7/7e/Tankersidedecal.png Side Decal PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG] || N/A || N/A<br />
|-<br />
| Astaro TPF-4 Ambulance || [https://ntbigroup.com/TEMPLATES/FIRE/TPF4%20Template%20Front.psd Front PSD] [https://ntbigroup.com/TEMPLATES/FIRE/TPF4%20Template%20FrontGIMP.xcf XCF (GIMP)]<br>[https://ntbigroup.com/TEMPLATES/FIRE/TPF4%20Template%20Back.psd Rear PSD] [https://ntbigroup.com/TEMPLATES/FIRE/TPF4%20Template%20BackGIMP.xcf XCF (GIMP)] || N/A || N/A<br />
|-<br />
| SZYM Entourage 6 || [https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Entourage%20v6%20Exterior%20Template.psd PSD] || [https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Entourage%20v6%20Normal%20Template.tga TGA] || [https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Entourage%20v6%20Specular%20Template.tga TGA]<br />
|-<br />
| SZYM Entourage (sculpted) || [https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIliverydecaltemplate.psd Livery Decal PSD] [https://wiki.ntbigroup.com/images/4/49/NTBIliverydecaltemplatePNG.png PNG] || N/A || N/A<br />
|-<br />
| SZYM Intruder 6 || [https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Intruder%20v6%20Exterior%20Template.psd PSD] || [https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Intruder%20v6%20Normal%20Template.tga TGA] || [https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Intruder%20v6%20Specular%20Template.tga TGA]<br />
|-<br />
| SZYM Intruder (sculpted) || [https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIliverydecaltemplate.psd Livery Decal PSD] [https://wiki.ntbigroup.com/images/4/49/NTBIliverydecaltemplatePNG.png PNG] || N/A || N/A<br />
|-<br />
| SZYM Tahari || [https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIliverydecaltemplate.psd Livery Decal PSD] [https://wiki.ntbigroup.com/images/4/49/NTBIliverydecaltemplatePNG.png PNG] || N/A || N/A<br />
|-<br />
| Tredpro TR-50 Fire Helmet || [https://ntbigroup.com/TEMPLATES/platetextureexample.psd Front Plate PSD] [https://wiki.ntbigroup.com/images/0/07/Helmetplateexample.png PNG] || N/A || N/A<br />
|}<br />
<br />
For products not in this list, please refer to the owner's manual for template links.</div>NelsonJenkinshttps://wiki.ntbigroup.com/index.php?title=Making_Textures_For_NTBI_Vehicles&diff=2933Making Textures For NTBI Vehicles2021-03-21T02:42:01Z<p>NelsonJenkins: </p>
<hr />
<div>These are instructions on how to make textures for NTBI vehicles by using local textures.<br />
<br />
All Second Life viewers should support local textures (including the LL "default" viewer). Local textures allow you to apply a texture to an object without actually uploading it and paying L$10, but only you will be able to view it. Additionally, local textures update instantly, so you can view your changes almost immediately after saving to the file.<br />
<br />
Themes require a template. Templates for most NTBI vehicles are available [[Templates|here.]] You can also find the template on page 1 of Web Config (if the vehicle supports it) under the Custom tab for themes. Otherwise, templates are available in the manual.<br />
<br />
Side door decals ''do not'' require a template on mesh vehicles. On sculpted vehicles, templates are usually found in the manual notecard, but this guide does not address setting up sculpted vehicle decals.<br />
<br />
# Download the PSD (if you use GIMP and an XCF file is available, download that instead) and save it to your computer. Note that Photoshop Elements does not support PSDs with layers; you must use a full version of Photoshop.<br />
# Visit an NTBI Distribution Terminal in-world (one is available at the [http://ntbigroup.com/locations/ Astaro store in Prototype]) and get a copy of the free Texture Grabber tool.<br />
# Open up Photoshop, start designing your theme, and save as a JPG when you are ready to preview it. Make sure you save as the maximum quality. '''Do NOT save as PNG.'''<br />
# Rez the Texture Grabber and select a colored face using the Select Face tool. Click the texture on the Texture tab. Go to "Local" in the texture picker, create a new local texture, select the JPG file you just created, and apply it.<br />
# Then, touch that face. You will be given the UUID of your local texture in chat. Use this UUID in a custom theme field for the vehicle you're working on.<br />
# Now, when you save to that file (overwrite) with changes, they will appear on the vehicle almost immediately without any upload costs. This lets you preview it in realtime. You only need to use the Texture Grabber once.<br />
# '''When you are finished, make sure you upload the JPG file and apply them to the vehicle normally!''' If you do not upload the JPG as a normal texture, nobody else will able to be see your theme.<br />
# Save the file as a PSD or XCF so you can edit it later, if you want.</div>NelsonJenkinshttps://wiki.ntbigroup.com/index.php?title=Decal_templates&diff=2932Decal templates2021-03-21T02:41:03Z<p>NelsonJenkins: Redirected page to Templates</p>
<hr />
<div>#REDIRECT [[Templates]]</div>NelsonJenkinshttps://wiki.ntbigroup.com/index.php?title=Templates&diff=2931Templates2021-03-21T02:36:17Z<p>NelsonJenkins: Created page with "The following templates are available for NTBI products: {| class="wikitable" |- ! Product Name !! Diffuse (base) !! Normal (bumpmap) !! Specular (reflective) |- | Astaro Imp..."</p>
<hr />
<div>The following templates are available for NTBI products:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Product Name !! Diffuse (base) !! Normal (bumpmap) !! Specular (reflective)<br />
|-<br />
| Astaro Imperial || [https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIliverydecaltemplate.psd Livery Decal PSD] [https://wiki.ntbigroup.com/images/4/49/NTBIliverydecaltemplatePNG.png PNG] || N/A || N/A<br />
|-<br />
| Astaro TPF-1 Engine || [https://ntbigroup.com/TEMPLATES/FIRE/EngineFront1.psd Front PSD]<br>[https://ntbigroup.com/TEMPLATES/FIRE/EngineBack1.psd Rear PSD]<br>[https://wiki.ntbigroup.com/images/c/c9/Enginefrontdecal.png Front Decal PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG] || N/A || N/A<br />
|-<br />
| Astaro TPF-2 Tanker || [https://ntbigroup.com/TEMPLATES/FIRE/TankerFront1.psd Front PSD]<br>[https://ntbigroup.com/TEMPLATES/FIRE/TankerBack1.psd Rear PSD]<br>[https://wiki.ntbigroup.com/images/c/c9/Enginefrontdecal.png Front Decal PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG] || N/A || N/A<br />
|-<br />
| Astaro TPF-3 Ladder || [https://ntbigroup.com/TEMPLATES/FIRE/EngineFront1.psd Front PSD]<br>[https://ntbigroup.com/TEMPLATES/FIRE/LadderBack1.psd Rear PSD]<br>[https://wiki.ntbigroup.com/images/7/7e/Tankersidedecal.png Side Decal PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG] || N/A || N/A<br />
|-<br />
| SZYM Entourage 6 || [https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Entourage%20v6%20Exterior%20Template.psd PSD] || [https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Entourage%20v6%20Normal%20Template.tga TGA] || [https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Entourage%20v6%20Specular%20Template.tga TGA]<br />
|-<br />
| SZYM Entourage (sculpted) || [https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIliverydecaltemplate.psd Livery Decal PSD] [https://wiki.ntbigroup.com/images/4/49/NTBIliverydecaltemplatePNG.png PNG] || N/A || N/A<br />
|-<br />
| SZYM Intruder 6 || [https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Intruder%20v6%20Exterior%20Template.psd PSD] || [https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Intruder%20v6%20Normal%20Template.tga TGA] || [https://ntbigroup.com/TEMPLATES/SZYM/SZYM%20Intruder%20v6%20Specular%20Template.tga TGA]<br />
|-<br />
| SZYM Intruder (sculpted) || [https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIliverydecaltemplate.psd Livery Decal PSD] [https://wiki.ntbigroup.com/images/4/49/NTBIliverydecaltemplatePNG.png PNG] || N/A || N/A<br />
|-<br />
| SZYM Tahari || [https://ntbigroup.com/TEMPLATES/NTBIsidedecaltemplate.psd Door Decal PSD] [https://wiki.ntbigroup.com/images/d/d1/NTBIsidedecaltemplatePNG.png PNG] [https://wiki.ntbigroup.com/images/0/02/NTBIdualsidedecaltemplatePNG.png Dual PNG]<br>[https://ntbigroup.com/TEMPLATES/NTBIliverydecaltemplate.psd Livery Decal PSD] [https://wiki.ntbigroup.com/images/4/49/NTBIliverydecaltemplatePNG.png PNG] || N/A || N/A<br />
|-<br />
| Tredpro TR-50 Fire Helmet || [https://ntbigroup.com/TEMPLATES/platetextureexample.psd Front Plate PSD] [https://wiki.ntbigroup.com/images/0/07/Helmetplateexample.png PNG] || N/A || N/A<br />
|}<br />
<br />
For products not in this list, please refer to the owner's manual for template links.</div>NelsonJenkinshttps://wiki.ntbigroup.com/index.php?title=InfoCenter&diff=2930InfoCenter2021-01-15T19:23:29Z<p>NelsonJenkins: </p>
<hr />
<div>{{ infobox product<br />
| title = InfoCenter<br />
| image = [[File:replaceme.jpg|200px|center]]<br />
| caption = InfoCenter Display Kit vendor image.<br />
| inventor = [[Nelson Jenkins]], [[SLI Komarov]]<br />
| launch year = 2008, upgraded in 2014<br />
| company = [[Gentek]]<br />
| available = Marketplace & In-World<br />
| url = '''[https://marketplace.secondlife.com/p/InfoCenter-Display-Kit-Four-Electronic-Text-Display-Sign-Models/6579929 InfoCenter Display Kit]'''<br>'''[https://marketplace.secondlife.com/p/InfoCenter-Mobile-Trailer-Mounted-Electronic-Text-Display-Sign/6579901 InfoCenter Mobile]'''<br />
}}<br />
<br />
The '''InfoCenter''' is a series of electronic text display signs (Personal, Notice, Highway, Matrix, and Mobile) sold by [[Gentek]]. They are designed for transportation & commercial purposes, although have been creatively used for a wide variety of applications. They are all web-controllable and include an API for scripters and web developers.<br />
<br />
This page covers the InfoCenter Series v3 and above. Because of the complexity in the new system and licensing restrictions, v3 is not a free update. For older versions, visit these pages: [[InfoCenter Mobile|Mobile]], [[InfoCenter Highway|Highway]], or [[InfoCenter Personal|Personal]]<br />
<br />
==Models==<br />
The InfoCenter is made up of two separate products - the InfoCenter Display Kit, and the InfoCenter Mobile.<br />
<br />
===InfoCenter Display Kit===<br />
The Display Kit includes the following models (in both standard and Duo variants, Duo typically doubling both the number of lines and characters per line, effectively quadrupling capacity):<br />
* '''InfoCenter Personal''' - 16 x 1 (2 LI) or 32 x 2 (5 LI) characters. Ideal for general commercial use, and includes a variety of animated graphics for stores.<br />
* '''InfoCenter Notice''' - 16 x 7 (8 LI) or 32 x 14 (29 LI) characters. The highest-capacity model, ideal for news & information. Also includes graphics for commercial & industrial purposes.<br />
* '''InfoCenter Highway''' - 16 x 3 (4 LI) or 32 x 6 (13 LI) characters. Best suited for overhead gantry installations on roads, but can be used for walkway or general commercial applications.<br />
* '''InfoCenter Matrix''' - 4 x 2 (1 LI) or 8 x 5 (3 LI) characters. A road sign display with many graphics for lane control, variable speed limits, hazard warning, detours, turn restrictions, and more.<br />
All models, excluding the Highway, have a toggleable mounting bracket. All models are modifiable (scripts excluded) and can be resized or linked (with the caveat that they cannot be linked together).<br />
<br />
===InfoCenter Mobile===<br />
The Mobile model is used for construction & road closures. 8 x 3 characters (3 LI) - the Mobile does not have a Duo variant. It is a trailer unit which can be rotated for the optimum viewing angle. It also has two trailer colors (grey & orange) and the display unit can be resized to three different sizes for different use cases. Unlike other models, the InfoCenter Mobile is not modifiable.<br />
<br />
Because of the Mobile's long-lasting popularity over other models, we sell it separately to reduce costs for those just interested in this model. Besides the features above, the Mobile is technically identical to all other models - it is web controllable and uses the same API.<br />
<br />
==Setup & Use==<br />
InfoCenter devices are ready for use out of the box. You can control some cosmetic options described above, but once they are rezzed, they can be set immediately.<br />
<br />
All InfoCenter devices are accessible through the [http://ntbigroup.com/gentek/infocenter/ InfoCenter Manager.] If you access the Manager directly, you will have to log in - you can avoid this by clicking a sign and selecting ''Web Control''. (This will also highlight the selected sign in the manager.)<br />
<br />
If you have not created an NTBI Group account before, you will be prompted to enter a password - do not use your SL password for this! Then, in the future, you can log in to the NTBI Group website (including the InfoCenter Manager) without even being in-world.<br />
<br />
===Setting a Message===<br />
You can set any of your InfoCenter devices from the InfoCenter Manager. Click the ''Set'' button, and you will be shown the message designer interface.<br />
<br />
Messages are made up of slides. Each slide can either be a text slide or a graphic slide, and can be set to display for generally any length of time you want. Slides are displayed sequentially and loop when completed.<br />
<br />
The grey number next to the model name for the device you are setting is the maximum number of slides - this is dependent on the capacity of the display, so smaller displays can handle more slides (up to 60). Some very high capacity devices (such as the Notice Duo) can only handle a few slides.<br />
<br />
When you open the message designer, the message currently displayed on that device will be shown, so you can edit it if you wish. By default, it is a single blank slide.<br />
<br />
* To add a text slide, type your message into the text cell input area. By default, the Amber color is used, but you can click any color in the palette below to select that color. Any new characters you type will then be in that color. When you're finished, click the ''Add Text'' button to add it to the slides.<br />
** Because of Javascript limitations, you must release each key before typing the next one, otherwise it won't register - type slowly and carefully!<br />
** Some characters are not permitted as text. If that is the case, they will not be entered.<br />
** For a full box character, like older InfoCenter models, use the ^ (caret) character. (This will not be shown on the website - it will only appear correctly in-world.)<br />
* To add a graphic slide, select a graphic from the dropdown. A preview will appear above it. To add the graphic, click ''Add Graphic''.<br />
* To move slides around or delete them, click the icons next to them. Keep in mind that by default, a blank slide is included as the first slide - you may want to remove it.<br />
* To change the time that a slide is shown, click ''Change'' and type in a new time (in seconds), then click ''Save''. Some high-capacity devices require longer slide times.<br />
<br />
When you're finished, click ''Send To This Device''. The message will be sent and displayed immediately in-world. For information on how the ''Send To Entire Group'' button works, read '''Using Groups''' below.<br />
<br />
===Using Templates===<br />
Templates are a way to easily save and recall messages. Say, for example, that you have 3 different messages you plan on displaying, but only one at a time, and you don't want to retype them every time. Templates allow you to save the message and load it later on that device (or any same-model device).<br />
<br />
* To save a template, design the message that you want to display, then type in a name above the ''Save As Template'' button, then click the button. If you already have a template with that name, it will be overwritten, so check first.<br />
* To load a template, click the dropdown to the right and select the template you want, then click ''Load''. To permanently delete a template, click ''Delete'' instead.<br />
<br />
===Using Groups===<br />
Groups are an easy way to control multiple devices at once. Devices can only belong to a single group at a time, but you can have multiple groups. Each group can only support one specific model.<br />
<br />
* To add a device to a group, click the ''Group'' button, then enter the name of the group you want to add it to. If the group doesn't exist, it will be created. If it does, the device will simply be added to the group.<br />
* To remove a device from a group, click the ''Group'' button, delete the text in the textbox, and then click ''OK''. This will remove it from the group. If the group no longer has any members, it will be hidden, but not technically deleted - if you recreate that group with the same name, the API key will be retained. (More information on this is in the API section.)<br />
* To rename a group, click the ''Rename'' button next to it, then enter a new group name. This will rename it without changing the API key, and all devices will remain in the group under the new name.<br />
* To set a message on an entire group, begin by setting a message on a single group member. When you're ready, click ''Send To Entire Group''. This will send the message to all group members.<br />
<br />
===Renaming & Deleting Devices===<br />
When your device is first rezzed, it will be named "Unnamed" followed by a number. Not only is this not descriptive, but it is a bit dangerous - if your display is reset for any reason, it will lose its old name and API key. To rename it, simply click the ''Rename'' button and enter a new name. You can also rename it from in-world using the ''Set Disp ID'' option.<br />
<br />
If your device disappears in-world, it will remain in the InfoCenter Manager. You can delete devices from the InfoCenter Manager by clicking ''Delete''. This will not delete it in-world - it will only disappear from the website and lose its API key. If you delete a display while it is still in-world and online, you will get a notification in-world.<br />
<br />
==Updates & Release Notes==<br />
You can update any InfoCenter product by rezzing it directly from your inventory (each one has an updater script which auto-deletes on first rez, so rezzing a used copy will not work).<br />
* '''v3.2'''<br />
** Added JSON API (backwards-compatible with earlier versions).<br />
** Improved font.<br />
** Fixed bug where graphic frame would be displayed at the same time as rendering text.<br />
* '''v3.1'''<br />
** Added chat API.<br />
* '''v3.0'''<br />
** Upgraded public release.<br />
** Rewrote everything, so old release notes are irrelevant.<br />
<br />
==API Documentation==<br />
For the legacy API, including the chat API, [[InfoCenter v3 Legacy API|see here]].<br />
<br />
The InfoCenter signs are controllable using an HTTP/JSON API. This can be used from LSL or from any software or server capable of forming JSON strings and sending HTTP requests.<br />
<br />
The API endpoint is http://ntbigroup.com/gentek/infocenter/api_json.php.<br />
<br />
A sample JSON request is as follows:<br />
<br />
{<br />
"request": "set_text",<br />
"api_key": "1234567890123456",<br />
"frames": [<br />
{<br />
"text": "Hello World!",<br />
"color": "",<br />
"align": "center",<br />
"word_wrap": true,<br />
"ignore_length": true,<br />
"time": 3<br />
},<br />
{<br />
"lines": [<br />
{<br />
"text": "ABCDEFGHIJKLMNOP",<br />
"color": "ROAYGBPWROAYGBPW",<br />
"align": "left"<br />
},<br />
{<br />
"text": "^^^^^^^^^^^^^^^^",<br />
"align": "right"<br />
}<br />
],<br />
"ignore_length": true,<br />
"time": 3<br />
},<br />
{<br />
"graphic": "Stop",<br />
"time": 3<br />
}<br />
]<br />
}<br />
<br />
===Required Key/Values===<br />
The JSON request must be an object with the following key-value pairs:<br />
<br />
* '''request''': Must be one of the following request types:<br />
** '''"set_text"''': Sets the text shown on a display or group of displays.<br />
** '''"set_name"''': Sets the name of a display or group.<br />
** '''"set_group"''': Adds or removes a display to/from a group.<br />
** '''"get_info"''': Gets information about a display or group.<br />
<br />
For '''set_text''' requests, the following key-value pairs are also required:<br />
* '''api_key''': The API key of the display or group to set. Remember to keep your API key private, because there is no other authentication.<br />
* '''frames''': An array of objects, each object being a single frame. See below for details on how these objects are defined.<br />
** Multiple frames can be sent in the same request, and they will cycle. The maximum number of frames is defined by the type of display being used. If the number of frames in the request exceeds the maximum, the server will return an error.<br />
<br />
For '''set_name''' requests, the following key-value pairs are also required:<br />
* '''api_key''': The API key of the display or group to rename.<br />
* '''name''': The new name to use. Must be between 1 and 64 characters.<br />
<br />
For '''set_group''' requests, the following key-value pairs are also required:<br />
* '''api_key''': The API key of the display to add to or remove from the group. Remember that the display and the group (if it exists) must be owned by the same user; displays cannot be added to groups owned by other users.<br />
* Only one of the following key-value pairs:<br />
** '''group_api_key''': The API key of the group to add the display to.<br />
** '''group_name''': The name of the group to add the display to. Must be between 1 and 64 characters.<br />
** '''group_remove''': Must be true to enable (JSON_TRUE in LSL). If enabled, will remove the display from its group.<br />
<br />
For '''get_info''' requests, the following key-value pair is also required:<br />
* '''api_key''': The API key of the display or group to get info about.<br />
<br />
===set_text Frame Object===<br />
Each frame must have only one of these required key-value pairs:<br />
<br />
* '''text''': A string of text to display.<br />
* '''lines''': An array of objects, each object being a single line on the display. Allows more precision in where text is displayed.<br />
* '''graphic''': The name of a graphic supported by this display (see below).<br />
<br />
The key-value above used determines which type of frame it is, which determines which options are available.<br />
<br />
====set_text Text Frame Type====<br />
A '''text''' frame type can have the following options:<br />
<br />
* '''text''': Required. A string of text to display.<br />
* '''color''': Optional. A color string (see below). If an empty string or not defined, "A" is used.<br />
** If the color string is shorter than the text string, the rest of the text uses the last color character.<br />
** If '''word_wrap''' is enabled, the entire frame will only be the color of the last color character due to technical limitations.<br />
* '''align''': Optional. Either "left", "center", or "right". Can also be "l", "c", or "r". If not defined, aligned to left.<br />
** If '''word_wrap''' is enabled, this will align each line. If it is disabled, this will only align the last line, because the lines before it (if any) will be the full width of the display.<br />
* '''word_wrap''': Optional. Must be true to enable (JSON_TRUE in LSL). If enabled, words are wrapped naturally. If disabled or not defined, text is "hard" wrapped to the full width of the display. It is a good idea to enable '''ignore_length''' to avoid errors if words wrap beyond the limits of the display.<br />
* '''ignore_length''': Optional. Must be true to enable (JSON_TRUE in LSL). If enabled, the server will not check the length of the text. If disabled or not defined, the server will return an error if the text exceeds the maximum the display can show.<br />
* '''time''': Optional. A length of time in seconds, between 1 and 3600, to display the frame. If not defined, the time will default to 5 seconds.<br />
** The server does not check the minimum time it would take to render the display, so very short frame times may produce unintended results.<br />
<br />
====set_text Lines Frame Type====<br />
A '''lines''' frame type can have the following options:<br />
<br />
* '''lines''': Required. An array of objects, each object being a single line on the display. Allows more precision in where text is displayed. Each line can have the following options:<br />
** '''text''': Required. A string of text to display on the line.<br />
** '''color''': Optional. Optional. A color string (see below). If the color string is shorter than the text string, the rest of the text uses the last color character. If the '''color''' option is not defined or is empty, "A" is used. If an invalid character is used, it is replaced with "W".<br />
** '''align''': Optional. Either "left", "center", or "right". Can also be "l", "c", or "r". If not defined, aligned to left.<br />
* '''ignore_length''': Optional. Must be true to enable (JSON_TRUE in LSL). If enabled, the server will not check the length of the text on each line, nor will it check the number of lines included in the request. If disabled or not defined, the server will return an error if the text exceeds the maximum the display can show in either dimension.<br />
* '''time''': Optional. A length of time in seconds, between 1 and 3600, to display the frame. If not defined, the time will default to 5 seconds.<br />
** The server does not check the minimum time it would take to render the display, so very short frame times may produce unintended results.<br />
<br />
====set_text Graphic Frame Type====<br />
A '''graphic''' frame type can have the following options:<br />
<br />
* '''graphic''': The name of a graphic supported by this display. This is case-insensitive, but must otherwise be an exact match to a supported graphic, or the server will return an error. The supported graphics are as follows:<br />
** ''InfoCenter Highway'': "Stop", "Hazard", "Do Not Enter"<br />
** ''InfoCenter Matrix'': "Stop", "Hazard", "Do Not Enter", "Detour Left", "Detour Right", "Lane Open Down", "Lane Open Up", "Lane Closed", "Lane Left Down", "Lane Right Down", "Lane Left Up", "Lane Right Up", "One Way Left", "One Way Right", "Yield", "Do Not Pass", "Stay In Lane", "No Trucks", "Trucks OK", "Speed Limit 5", "Speed Limit 10", "Speed Limit 15", "Speed Limit 20", "Speed Limit 25", "Speed Limit 30", "Speed Limit 35", "Speed Limit 40", "Speed Limit 45", "Speed Limit 50", "Speed Limit 55", "Speed Limit 60", "Speed Limit 65", "Speed Limit 70", "Speed Limit 75", "Speed Limit 80", "Keep Right", "Keep Left", "No Right Turn", "No Left/U Turn", "No Left Turn", "No U Turn", "Straight Or Left", "Straight Or Right", "Straight Only", "Left Turn Only", "Right Turn Only", "No Turns"<br />
** ''InfoCenter Notice'': "Information", "Today's Events", "Huge Sale", "Discounts", "Best Deals", "Notice", "Warning", "Danger"<br />
** ''InfoCenter Personal'': "Sale", "Come On In", "News Flash", "Happy 4th", "Welcome", "Open", "Closed", "Thank You", "No Smoking"<br />
** ''InfoCenter Mobile'': "Stop", "Hazard", "Do Not Enter", "Chase Right", "Chase Left", "Arrow Right", "Arrow Left", "Flash Right", "Flash Left", "Chevron Right", "Chevron Left", "Arrow Split", "Flash Split", "Flagger", "Stop Left", "Stop Right", "Detour Left", "Detour Right"<br />
* '''time''': Optional. A length of time in seconds, between 1 and 3600, to display the frame. If not defined, the time will default to 5 seconds.<br />
<br />
===HTTP Request Format===<br />
The required URL, as part of an LSL HTTP request, is as follows:<br />
<br />
llHTTPRequest("<nowiki>http://ntbigroup.com/gentek/infocenter/api_json.php</nowiki>", [HTTP_METHOD, "PUT"], json_request);<br />
<br />
This URL is also accessible from any web server.<br />
<br />
===HTTP Response Format===<br />
The server returns a JSON object with the following key-value pairs:<br />
<br />
* '''api''': Always "infocenter_json".<br />
* '''status''': Either "ok" or "error".<br />
* '''error''': An error number. Only included if '''status''' is "error". Include this number if possible when contacting support.<br />
* '''text''': A textual status response. If successful, will include how many displays/groups succeeded and failed. If failed, will include a human-readable error message.<br />
<br />
For '''get_info''' requests, the following key-value pairs are also returned:<br />
* '''api_key_type''': Either "display" or "group".<br />
* '''name''': The name of the display or group.<br />
* '''owner''': The owner of the display or group.<br />
* '''uuid''': The UUID of the display. Only included if '''api_key_type''' is '''"display"'''.<br />
* '''location''': The location of the display in the format <code>Region Name (128, 128, 20)</code>. May not be accurate if the display has been moved since it was rezzed. Only included if '''api_key_type''' is '''"display"'''.<br />
* '''group''': The group that the display is in. If the display is not in a group, an empty string is returned. Only included if '''api_key_type''' is '''"display"'''.<br />
* '''type''': The display type, such as "InfoCenter Mobile", for the display or group.<br />
* '''cols''': The number of columns in each row of the display or group type.<br />
* '''rows''': The number of rows of characters that the display or group type can show.<br />
* '''frames''': The maximum number of frames that the display or group type can show.<br />
* '''displays''': An array of API keys of displays in the group. Only included if '''api_key_type''' is '''"group"'''.<br />
<br />
===LSL Sample===<br />
A sample LSL script, implementing the JSON sample above, is below:<br />
<br />
key api_request;<br />
default<br />
{<br />
state_entry()<br />
{<br />
string json_request = llList2Json(JSON_OBJECT, [<br />
"request", "\"set_text\"",<br />
"api_key", "\"1234567890123456\"",<br />
"frames", llList2Json(JSON_ARRAY, [<br />
llList2Json(JSON_OBJECT, [<br />
"text", "\"Hello World!\"",<br />
"color", "",<br />
"align", "center",<br />
"word_wrap", JSON_TRUE,<br />
"ignore_length", JSON_TRUE,<br />
"time", 3<br />
]),<br />
llList2Json(JSON_OBJECT, [<br />
"lines", llList2Json(JSON_ARRAY, [<br />
llList2Json(JSON_OBJECT, [<br />
"text", "\"ABCDEFGHIJKLMNOP\"",<br />
"color", "\"ROAYGBPWROAYGBPW\"",<br />
"align", "left"<br />
]),<br />
llList2Json(JSON_OBJECT, [<br />
"text", "\"^^^^^^^^^^^^^^^^\"",<br />
"align", "r"<br />
])<br />
]),<br />
"ignore_length", JSON_TRUE,<br />
"time", 5<br />
]),<br />
llList2Json(JSON_OBJECT, [<br />
"graphic", "\"Stop\"",<br />
"time", 3<br />
])<br />
])<br />
]);<br />
api_request = llHTTPRequest("<nowiki>http://ntbigroup.com/gentek/infocenter/api_json.php</nowiki>", [HTTP_METHOD, "PUT"], json_request);<br />
}<br />
http_response(key request_id, integer status, list metadata, string body)<br />
{<br />
if (request_id == api_request)<br />
{<br />
api_request = NULL_KEY;<br />
if (status == 200) llOwnerSay("Response: " + body);<br />
else llOwnerSay("Server error. (" + (string)status + ")");<br />
}<br />
}<br />
}<br />
<br />
Note that LSL's JSON handling requires you to wrap values in escaped quotes, like so:<br />
<br />
["request", "\"set_text\""]<br />
<br />
You do not need to wrap keys in escaped quotes because the specification does not include any keys that could be interpreted as raw JSON.<br />
<br />
{{Gentek}}</div>NelsonJenkinshttps://wiki.ntbigroup.com/index.php?title=Gentek_Company_Policy&diff=2929Gentek Company Policy2020-11-21T19:51:32Z<p>NelsonJenkins: </p>
<hr />
<div>This policy applies to all products and services sold by [[Gentek]] unless stated otherwise in the product manual or service agreement.<br />
<br />
==Return Policy==<br />
Gentek (hereafter "we") does not accept any returns. Most Second Life products are copyable and non-transferable.<br />
<br />
==Refunds/Redeliveries==<br />
* We offer refunds only for double purchases for products purchased after January 1, 2010 when reported within 7 days of the last purchase.<br />
** NOTE: For purchases made through the Marketplace, affiliate vendors, or other methods in which Gentek only receives part of the purchase price, Gentek will only refund that amount, '''NOT''' the purchase price. To avoid this, we recommend purchasing products directly from our main store.<br />
* We do not offer refunds on purchases made by mistake, or purchases made based on a misinterpretation of product capabilities and limitations. '''It is the customer's responsibility to contact us and ensure that the product will fit their needs.'''<br />
* We do not offer refunds on purchases that are not shown in both sales and transaction logs.<br />
* We do not offer refunds, redeliveries, or additional support (such as manual database operations) on products which have been discontinued (i.e. are no longer available for purchase). This includes old versions.<br />
* We do not offer refunds, redeliveries, or support to customers in cases we deem to have extenuating circumstances.<br />
* We are obligated to deliver products purchased which have failed to be delivered and will do so as soon as possible after the misdelivery is reported.<br />
<br />
==Transfers==<br />
We do not transfer purchases to other accounts, even if they are owned by the same person.<br />
<br />
==Permissions==<br />
We do not negotiate permissions for its products. Products are only sold with the permissions on the vendor image.<br />
<br />
==Changes to This Document==<br />
We reserve the right to change our Company Policy, Lifetime Warranty, any Terms of Service applicable to any specific service, and any Terms of Use or End-User Licensing Agreement applicable to any specific product at any time without prior warning. However, we will notify our customers in-world through the "Gentek Technologies Corporation" group as to any changes, along with our news feed available on the home page.<br />
<br />
==Warranty Coverage==<br />
This warranty only applies to products that do not include a warranty of their own (and products that link to this warranty as their own).<br><br />
Gentek's warranty obligations are limited to the terms set forth below: Gentek warrants their products against defects in materials and workmanship for the lifetime of the product. If a defect exists, at its option Gentek will repair the product at no charge and send an update. A replacement product/part assumes the remaining warranty of the original product. Service fees do not apply for the duration of your warranty for any purpose including but not limited to installation help and technical support.<br />
<br />
===Warranty Exclusions and Limitations===<br />
This Lifetime Warranty applies only to products manufactured by or for Gentek. This Lifetime Warranty does not apply to any non-Gentek software, even if packaged or sold with Gentek software. Non-Gentek manufacturers, suppliers, or publishers may provide their own warranties. Gentek and its affiliates are not liable for any damage to or loss of any programs, data, or other information stored on any media, or any non-Gentek product or part not covered by this warranty. Recovery and reinstallation of user data is not covered under this Lifetime Warranty. This warranty does not apply: (a) to damage caused by accident, abuse, misuse, misapplication, or non-Gentek products; (b) to damage caused by service (including upgrades and expansions) performed by anyone who is not the product's original creator or a certified support agent; (c) to a product or a part that has been modified without the written permission of Gentek; or (d) to products not sold through Gentek or its affiliates/resellers.<br><br />
THIS WARRANTY AND REMEDIES SET FORTH ABOVE ARE EXCLUSIVE AND IN LIEU OF ALL OTHER WARRANTIES, REMEDIES AND CONDITIONS, WHETHER ORAL OR WRITTEN, EXPRESS OR IMPLIED, UNLESS THE WARRANTY IS INCLUDED WITHIN THE PRODUCT INFO NOTECARD AND/OR IS ON THE SUPPORT PAGE. GENTEK SPECIFICALLY DISCLAIMS ANY AND ALL IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IF GENTEK CANNOT LAWFULLY DISCLAIM IMPLIED WARRANTIES UNDER THIS LIMITED WARRANTY, ALL SUCH WARRANTIES, INCLUDING WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE LIMITED IN DURATION TO 30 DAYS.<br><br />
GENTEK IS NOT RESPONSIBLE FOR DIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES RESULTING FROM ANY BREACH OF WARRANTY OR CONDITION, OR UNDER ANY OTHER LEGAL THEORY, INCLUDING BUT NOT LIMITED TO LOST PROFITS, DOWNTIME, GOODWILL, DAMAGE TO OR REPLACEMENT OF EQUIPMENT AND PROPERTY, ANY COSTS OF RECOVERING, REPROGRAMMING, OR REPRODUCING ANY PROGRAM OR DATA STORED IN OR USED WITH GENTEK PRODUCTS, AND ANY FAILURE TO MAINTAIN THE CONFIDENTIALITY OF DATA STORED ON THE PRODUCT. GENTEK SPECIFICALLY DOES NOT REPRESENT THAT IT WILL BE ABLE TO REPAIR ANY PRODUCT UNDER THIS WARRANTY OR MAKE A PRODUCT EXCHANGE WITHOUT RISK TO OR LOSS OF SCRIPTS OR DATA.<br />
<br />
==Full Permissions Agreement==<br />
The Full Permissions Agreement (FPA) has been transferred into the [[NTBI Limited Transferable Product License]] (LTPL). All products bound by the FPA are now bound by the NTBI LTPL, and its terms are incorporated herein.<br />
is now called the Transferable Product Agreement (TPA). All products bound by the FPA are now bound by the TPA (see below).<br />
<br />
==Transferable Product Agreement==<br />
The Transferable Product Agreement (TPA) has been transferred into the [[NTBI Limited Transferable Product License]] (LTPL). All products bound by the FPA are now bound by the NTBI LTPL, and its terms are incorporated herein.<br />
<br />
==Review Rewards Program==<br />
The terms & conditions of the Review Rewards Program is available [[Review Rewards Program|on the NTBI Review Rewards Program page]].<br />
<br />
==Privacy Policy==<br />
Gentek values the privacy of our customers. In accordance with the California Business & Professions Code, 22575-22579 B.P.C., we lawfully supply this privacy policy to our users.<br><br />
We do not store any user data on our servers except the following, unless stated elsewhere:<br />
* Avatar name & avatar key/UUID: This data is collected by Gentek for registration identification purposes in our products and CasperVend for use in their vendor systems.<br />
* Parcel & region data (including owner name & key/UUID): This data is collected by Gentek through reseller/affiliate vendors and all payment tools (objects which process user payments) for transaction records.<br />
* Times and dates of use: This data is collected by Gentek through some products (genPhone series) to measure network load and usage metrics.<br />
* Voluntarily-stored information: genPhone voicemails and other voluntarily-stored information is stored by Gentek for a minimum of 90 days for legal purposes.<br />
* IP address: Your IP address is logged and stored by NTBI and our webhost when you visit this website. We do not access nor store your IP address through other means, such as Second Life. We cannot remove this data.<br />
If you would like to have your data removed from our servers, please contact us.<br><br />
This privacy policy is effective December 10, 2010.<br />
<br />
==Copyright & Trademark Notice==<br />
This website, its sitemap design, the information herein, product names, product designs, store locations (with the exception of building objects in rental instances), in-world Second Life objects and items bearing the Gentek name and/or logo, and included scripts, textures, objects, and other inventory are the property of Gentek, Nelson Jenkins, and the Second Life® account owner of Nelson Jenkins unless specified otherwise. No materials contained in this website, nor its design, nor any item or data using a Gentek trademark, patent, design, script, texture, object, or other inventory may be reproduced, distributed, transmitted, displayed, published, or broadcast without the prior written permission of one of the entities that retain the rights that apply to them. You may not alter or remove any trademark, copyright, or other notice from copies of the content.<br><br />
Second Life and Linden Lab are trademarks of Linden Research, Inc.<br><br />
All other trademarks are those of their respective owners. No infringement is intended.</div>NelsonJenkinshttps://wiki.ntbigroup.com/index.php?title=NTBI_Limited_Transferable_Product_License&diff=2927NTBI Limited Transferable Product License2020-11-21T19:50:22Z<p>NelsonJenkins: NelsonJenkins moved page NTBI Transferable Product Agreement to NTBI Limited Transferable Product License</p>
<hr />
<div>This agreement only applies to products stated to be bound by the NTBI Limited Transferable Product License (LTPL) (previously referred to as the Gentek Transferable Product Agreement and the Gentek Full Permissions Agreement) in their user manual, vendor image, and/or product listing/description.<br />
<br />
'''Please refer to the [https://northbridgesys.com/permissions/ NorCloud Transferable Product Permissioning Guide] for step-by-step instructions on permissioning transferable products.''' Some NTBI products do not use NorCloud, but the steps are the same for any DRM system we use.<br />
<br />
We provide certain transferable products solely under the following End-User License Agreement (EULA) terms, which may be in addition to other terms.<br />
<br />
You (the customer) understand that any product sold under this agreement is licensed to you exclusively under these conditions. You are only granted such license as long as your use of the product conforms to these terms. You are not granted ownership rights to any intellectual property under these terms.<br />
<br />
You may use the item in the prefabricated buildings ("prefabs") you sell in Second Life as NO TRANSFER. You MAY NOT use the item in any other circumstances, such as selling it NO COPY, YES TRANSFER.<br />
<br />
You may use the item in your own buildings that you do not sell or distribute without changing the permissions, as long as "Anyone can Copy" and "Share with Group" are NOT CHECKED.<br />
<br />
You MAY NOT sell or distribute the item alone under any permissions. Any transfer of the item must be packaged in a building.<br />
<br />
You MAY NOT remove the included script(s) or otherwise modify the object's functionality in any way beyond cosmetic changes.<br />
<br />
You MAY NOT export the item out of the Second Life server/client, and you MAY NOT import the item into any OpenSim or other Second Life compatible grid. It must remain on the official Second Life main and testing grids.<br />
<br />
You understand that NTBI, at its discretion, can either manually or automatically check if a transferable item was purchased by its owner at any time, and if it was not, NTBI can disable and/or remove the item.<br />
<br />
If you do not accept or agree with this agreement, you may not use the product.<br />
<br />
''NOTE: Any included notecards should '''NOT''' be made no-transfer, and should be left full permissions. Otherwise, your product may not function.''<br />
<br />
In the event of a conflict of terms between this agreement and an individual product's separate EULA terms, the individual product's separate EULA terms are controlling.</div>NelsonJenkinshttps://wiki.ntbigroup.com/index.php?title=NTBI_Transferable_Product_Agreement&diff=2928NTBI Transferable Product Agreement2020-11-21T19:50:22Z<p>NelsonJenkins: NelsonJenkins moved page NTBI Transferable Product Agreement to NTBI Limited Transferable Product License</p>
<hr />
<div>#REDIRECT [[NTBI Limited Transferable Product License]]</div>NelsonJenkinshttps://wiki.ntbigroup.com/index.php?title=NTBI_Limited_Transferable_Product_License&diff=2926NTBI Limited Transferable Product License2020-11-21T19:49:34Z<p>NelsonJenkins: </p>
<hr />
<div>This agreement only applies to products stated to be bound by the NTBI Limited Transferable Product License (LTPL) (previously referred to as the Gentek Transferable Product Agreement and the Gentek Full Permissions Agreement) in their user manual, vendor image, and/or product listing/description.<br />
<br />
'''Please refer to the [https://northbridgesys.com/permissions/ NorCloud Transferable Product Permissioning Guide] for step-by-step instructions on permissioning transferable products.''' Some NTBI products do not use NorCloud, but the steps are the same for any DRM system we use.<br />
<br />
We provide certain transferable products solely under the following End-User License Agreement (EULA) terms, which may be in addition to other terms.<br />
<br />
You (the customer) understand that any product sold under this agreement is licensed to you exclusively under these conditions. You are only granted such license as long as your use of the product conforms to these terms. You are not granted ownership rights to any intellectual property under these terms.<br />
<br />
You may use the item in the prefabricated buildings ("prefabs") you sell in Second Life as NO TRANSFER. You MAY NOT use the item in any other circumstances, such as selling it NO COPY, YES TRANSFER.<br />
<br />
You may use the item in your own buildings that you do not sell or distribute without changing the permissions, as long as "Anyone can Copy" and "Share with Group" are NOT CHECKED.<br />
<br />
You MAY NOT sell or distribute the item alone under any permissions. Any transfer of the item must be packaged in a building.<br />
<br />
You MAY NOT remove the included script(s) or otherwise modify the object's functionality in any way beyond cosmetic changes.<br />
<br />
You MAY NOT export the item out of the Second Life server/client, and you MAY NOT import the item into any OpenSim or other Second Life compatible grid. It must remain on the official Second Life main and testing grids.<br />
<br />
You understand that NTBI, at its discretion, can either manually or automatically check if a transferable item was purchased by its owner at any time, and if it was not, NTBI can disable and/or remove the item.<br />
<br />
If you do not accept or agree with this agreement, you may not use the product.<br />
<br />
''NOTE: Any included notecards should '''NOT''' be made no-transfer, and should be left full permissions. Otherwise, your product may not function.''<br />
<br />
In the event of a conflict of terms between this agreement and an individual product's separate EULA terms, the individual product's separate EULA terms are controlling.</div>NelsonJenkinshttps://wiki.ntbigroup.com/index.php?title=NTBI_Limited_Transferable_Product_License&diff=2925NTBI Limited Transferable Product License2020-11-21T19:49:02Z<p>NelsonJenkins: Created page with "This agreement only applies to products stated to be bound by the NTBI Limited Transferable Product License (LTPL) (previously referred to as the Gentek Transferable Product A..."</p>
<hr />
<div>This agreement only applies to products stated to be bound by the NTBI Limited Transferable Product License (LTPL) (previously referred to as the Gentek Transferable Product Agreement) in their user manual, vendor image, and/or product listing/description.<br />
<br />
'''Please refer to the [https://northbridgesys.com/permissions/ NorCloud Transferable Product Permissioning Guide] for step-by-step instructions on permissioning transferable products.''' Some NTBI products do not use NorCloud, but the steps are the same for any DRM system we use.<br />
<br />
We provide certain transferable products solely under the following End-User License Agreement (EULA) terms, which may be in addition to other terms.<br />
<br />
You (the customer) understand that any product sold under this agreement is licensed to you exclusively under these conditions. You are only granted such license as long as your use of the product conforms to these terms. You are not granted ownership rights to any intellectual property under these terms.<br />
<br />
You may use the item in the prefabricated buildings ("prefabs") you sell in Second Life as NO TRANSFER. You MAY NOT use the item in any other circumstances, such as selling it NO COPY, YES TRANSFER.<br />
<br />
You may use the item in your own buildings that you do not sell or distribute without changing the permissions, as long as "Anyone can Copy" and "Share with Group" are NOT CHECKED.<br />
<br />
You MAY NOT sell or distribute the item alone under any permissions. Any transfer of the item must be packaged in a building.<br />
<br />
You MAY NOT remove the included script(s) or otherwise modify the object's functionality in any way beyond cosmetic changes.<br />
<br />
You MAY NOT export the item out of the Second Life server/client, and you MAY NOT import the item into any OpenSim or other Second Life compatible grid. It must remain on the official Second Life main and testing grids.<br />
<br />
You understand that NTBI, at its discretion, can either manually or automatically check if a transferable item was purchased by its owner at any time, and if it was not, NTBI can disable and/or remove the item.<br />
<br />
If you do not accept or agree with this agreement, you may not use the product.<br />
<br />
''NOTE: Any included notecards should '''NOT''' be made no-transfer, and should be left full permissions. Otherwise, your product may not function.''<br />
<br />
In the event of a conflict of terms between this agreement and an individual product's separate EULA terms, the individual product's separate EULA terms are controlling.</div>NelsonJenkinshttps://wiki.ntbigroup.com/index.php?title=IntelliDoor_GSS&diff=2924IntelliDoor GSS2020-11-12T15:25:34Z<p>NelsonJenkins: </p>
<hr />
<div>The IntelliDoor GSS (Global Security Server) is a tool used to coordinate security settings among many IntelliDoor products. While group control is easiest for limited access, in some cases it is not possible (autoreturn where the land group is not the group you want to allow, for instance). In this case, if you have many IntelliDoors, the GSS provides a single point where you can list people who should have access.<br />
<br />
==Setup==<br />
# Rez the GSS object and open it by right clicking and selecting Open, then double-clicking the "_config" notecard.<br />
# Edit the notecard according to who you want to allow and disallow from all of the doors using this server. Make sure you change the server's name to the same server used by your doors. For more information on the whitelist, read the section labeled "WHITELIST".<br />
# Save the notecard and close it. The server should automatically load the configuration, and all doors using that GSS (v3.0 and above) should automatically reset.<br />
<br />
==Whitelist==<br />
The GSS's primary purpose is its whitelist. When a door (or other component) "subscribes" to a GSS by using the same server name in its _config notecard, it loads this list upon resetting. As of v3.0, the blacklist was removed for compatibility purposes.<br><br />
Those in the whitelist always have access to the door, regardless of the door's local settings. The lists are only limited by memory - theoretically, the system should handle more than 100 names easily.<br><br />
'''NOTE: Whitelist names are ''usernames'' (nelson.jenkins, newbie), not ''legacy names'' (Nelson Jenkins, Newbie Resident).''' If you have more than 10 names, please read "Extended Whitelist" below.<br />
<br />
===Extended Whitelist===<br />
Because of LSL limitations, the whitelist line can only be read for 255 characters. However, the IntelliDoor system supports multiple whitelist lines. To be safe, separate your whitelist into 10-name increments, like so:<br><br />
<code>WHITELIST=User01, User02, User03, User04, User05, User06, User07, User08, User09, User10<br>WHITELIST=User11, User12, User13, User14</code><br><br />
Due to more LSL limitations, the whitelist will max out at around 500 characters, or about 35 names. Chaining GSSes will not fix this.<br />
<br />
==Chaining==<br />
Multiple GSS units can now be chained together, such that there can be a "master" GSS, then other GSS units that pull from the "master". For example, the "master" GSS could hold administrator names for a building or region, then you could have a separate GSS for every area that would be managed by different people.<br><br />
'''It is important that you do not create a loop with this feature!''' For example, if you chain two GSS units together, they will continuously "update" from each other, lagging down the communications channel. If you plan on using this feature, enable the "DEBUG=1" option. This will send you a message whenever the GSS data is downloaded or sent; if you notice that this keeps sending every so often, check to make sure you do not have a loop. You can set it back to "DEBUG=0" once you have checked this.<br />
<br />
==Builder Kit Instructions==<br />
<font size="4">[[Builder Kit Permissioning|Follow this guide]] before using your Builder Kit components, or they will break.</font><br />
<br />
Make sure you review the [[Gentek Company Policy|Full Permissions Agreement]] to understand how you may distribute IntelliDoor products. Remember, objects in violation of this agreement will be remotely deleted. Therefore, make sure you follow the above instructions exactly.<br />
<br />
==Updates & Release Notes==<br />
You can update your IntelliDoor GSS by simply rezzing it.<br />
* v3.1.3<br />
** Fixed permissions issue (standalone version only)<br />
* v3.1.2<br />
** Fixed GSS chaining issue in some cases<br />
* v3.1<br />
** Fix involving GSS not sending updated whitelist on reset<br />
* v3.0<br />
** Implemented Buildbox integration<br />
** Doors now automatically reset when GSS is reset<br />
** Usernames in whitelist are no longer case-sensitive<br />
** Blacklist removed<br />
** Communications now streamlined onto single channel for less lag<br />
** GSS can now be chained together (''WARNING'': please read "Chaining" section above before doing this)<br />
* v2.1.3<br />
** Fixed GSS not working with v2.1.1+ doors when ID has spaces.<br />
* v2.1<br />
** Changed old-style names to usernames.<br />
** Slight tweaks.<br />
* v2.0<br />
** Primary public release.<br />
<br />
{{Gentek}}</div>NelsonJenkinshttps://wiki.ntbigroup.com/index.php?title=NTBI_(region)&diff=2923NTBI (region)2020-10-21T23:19:27Z<p>NelsonJenkins: </p>
<hr />
<div>The '''NTBI region''' was the name of two regions - one created in 2013 and renamed in 2015, and one created in 2019 to house the [[Prototype|Prototype Gardens Shopping Centre]], [[SZYM Tower]], and various ancillary amenities. The creation of the 2019 '''NTBI region''' was done to consolidate the Prototype, Northbridge, Augest Isles (Glenbrook), and FAYDED regions, all homesteads considered part of the NTBI estate.<br />
<br />
==Original Region==<br />
The NTBI region was first created in October 2012. It hosted both versions of the [[NTBI Development Campus]], then was used as a sandbox to construct sections of [[Harrison]]. The region was renamed to Northbridge in 2015, then connected to [[Prototype (region)|Prototype]].<br />
<br />
==2019 Region==<br />
The second version of the NTBI region was created on December 4, 2019. The main features of the region are the [[Prototype|Prototype Gardens Shopping Centre]], [[SZYM Tower]], and the [[Peter Nelson Convention Center]].<br />
<br />
The region also includes:<br />
* The original Rodex Diner, which was originally housed in Prototype.<br />
* The Route 23 highway with automatic traffic, which was a popular feature in Glenbrook. As of mid-2020, the traffic is generally only activated upon request due to lag caused by Second Life region software memory leaks.<br />
* The Northbridge Line rail line, which automatically spawns trains at random intervals. This system was built from scratch, but is related to the original Northbridge Line that ran through Prototype, Northbridge, and Glenbrook before consolidation, as well as the old automatic train in Prototype after the first Prototype Gardens Mall expansion.<br />
* The Glenbrook Freight Terminal, which was originally housed in Glenbrook.<br />
* The Tredpro & Co. factory filler building with a steam whistle that sounds at 9 a.m., 12 p.m., and 5 p.m. daily, originally from Prototype.<br />
* A RoxOil gas station.</div>NelsonJenkinshttps://wiki.ntbigroup.com/index.php?title=NTBI_Group&diff=2922NTBI Group2020-10-21T23:14:46Z<p>NelsonJenkins: </p>
<hr />
<div>[[File:NTBI Logo With Shadow.png|300px|right]]The NTBI Group is the partnership of [[SZYM Motors]], [[Lusch Motors]], [[Astaro]], [[Tredpro]], [[Gentek]], [[NBS]], [[Gentek Telecom]], [[Jupiter Automotive]], [[GEMC]], [[FAYDED]], [[Trifecta]], [[GTMD]], [[RiDECO]], [[Lucetti]], [[3DL]], and [[K-ACE]]. Retired brands include [[LMD]], [[KYOTO]], Sei Computing (absorbed into [[NBS]]), TAHDA Prefabricated (absorbed into [[Trifecta]]), Motor City Cars (absorbed into Crown Automotive), and Crown Automotive (absorbed into [[Jupiter Automotive]]).<br />
<br />
Founded in 2008, the partnership was created to acknowledge the union of these different creators and their brands as one creative faction. The majority of the products purchasable from these stores are directed at the modern roleplay niche market of Second Life, but various brands occasionally branch out into broader fields.<br />
<br />
When it was founded in 2008, SZYM, Lusch, LMD, Astaro, and Tredpro were listed as its founding members. As the partnership grew, several creators split into different brands to classify their products. The partnership currently consists of [[Will Szymborska]], [[ac14 Hutson]], [[Nelson Jenkins]], [[Owen Lusch]], [[Lyte Rae]], [[BeckHan Ra]], [[Faye Blackheart]], [[Adel Button]], [[Rena (guraa)]], and [[Hal Berkmans]]. Support, inactive, and retired members include Wolf Lumin, DriverKid Baxter, Empty Neutron, Sierra Komarov, Georg Markstein, Ozark Mayo, Hans Ehrlich, Jeffery Worbridge, aaps59 Aeon, and Nikko Dezno. Generally, members are classed either EXC (Executive), AFF (Affiliate), IS (Internal Services), or RET (Retired).<br />
<br />
<br />
==History==<br />
[[File:33498794571 b58b53f7f2 o.jpg|300px|thumb|right|NTBI stores in Bliss, 2009. SZYM on left, Gentek in foreground, Astaro behind it to the right.]]<br />
[[File:NTBI-PORTRAIT-SMALL.jpg|300px|thumb|right|NTBI Group Portrait, Feb 2012]]<br />
[[File:Contact 2014portrait.jpg|300px|thumb|right|NTBI Group Portrait, 2014]]<br />
[[File:32785124424 bcd5484112 o.png|300px|thumb|left|Peter Nelson International Airport, a homestead-compatible airport design.]]<br />
[[File:25301819941 bdd5be2da7 o.png|300px|thumb|left|Harrison at dusk.]]<br />
[[File:15713752612 ddf9752822 o.png|300px|thumb|right|The extreme attention to detail in Harrison took several years to complete.]]<br />
[[File:21479161984 53e2562281 o.png|300px|thumb|left|Northbridge Complex during the development of the NorPhone.]]<br />
[[File:22724517995 d5e66939ba o.jpg|300px|thumb|right|Prototype Gardens Shopping Center prior to its 2017 expansion.]]<br />
<br />
ac14 Hutson claims that the creation of the NTBI name was based off the meme "Series of Tubes", where Alaskan Senator Ted Stevens says "the internet is not a big truck". The letters '''N'''o'''T''' a '''B'''ig Truck '''I'''ndustries (or '''N'''ot a '''B'''ig '''T'''ruck '''I'''ndustries with the "B" and "T" letters swapped) formed the acronym NTBI. Another rumored explanation for the name is National Truck Builders International (or Industries). To some members it is also known as National Tire & Battery Incorporated. In any event, the NTBI acronym has been in use since the logo was created on May 9th, 2008, when ac14 Hutson sold company land under the new name.<br />
<br />
The first NTBI-related project was the creation and sale of emergency vehicle attachment light kits produced by Tredpro for the LMD Interceptor and Enforcer in 2008. Ironically, these kits were produced to push Gentek out of the market, which had been selling similar kits for about a year. Soon after the partnership was formed, the stores of all NTBI brands (with the exception of LMD) were moved to the Bliss region to maximize store traffic by being placed alongside similar businesses. These light kits were soon discontinued due to the adoption of built in lighting over attachment lighting for emergency vehicles, even prior to mesh.<br />
<br />
In 2010, Nelson Jenkins joined the partnership anyway, bringing Gentek into the fold. Gentek soon diversified heavily into building equipment to support NTBI's various construction efforts, abandoning the third-party lighting market. However, Gentek continued to produce essentially all emergency vehicle lighting built into NTBI vehicles from 2011 onward, and Nelson Jenkins eventually scripted the [[SPT]] and [[SPT2]] powertrain script packages used in several NTBI vehicles.<br />
<br />
In 2011, Adel Button and Hal Berkmans became members the partnership under the General Transportation Manufacturing Division (GTMD) and K-ACE brands, respectively. This helped Will Szymborska start the TAHDA brand at the same time, which created prefabricated urban roleplay buildings. K-ACE was selected to produce electronics compatible with the then-developing [[BTN]], but after its abandonment in 2013, K-ACE shrunk its product lines to commercial furniture.<br />
<br />
2012 is considered "NTBI's Golden Age" by many NTBI members. Many products were created during this period, and NTBI maintained several properties for development, offices, and recreation. Lyte Rae became a partner after briefly competing with SZYM and Astaro in the emergency vehicle market under the Motor City Cars (MCC) brand. Later, MCC was rebranded to Crown Automotive, and Lyte branched out to create Lucetti, a fashion brand, and 3DL, a furniture brand. Also in 2012, Nelson Jenkins and Will Szymborska jointly created the Sei Computing brand, tasked exclusively with creating the [[Mark 1]] computer. DriverKid Baxter and Empty Neutron also started the KYOTO brand in 2012, which created small variety of roleplay tools, although it was closed about two years later. The mesh [[SZYM Intruder]] upgrade, created with the then-new [[SPT]] scripts, was also released in 2012 to bring SZYM into the mesh era. This included a variety of revolutionary products, such as Web Config, EVHUD 3, and the [[Global Fuel System]]. Gentek also launched the monumentally successful [[Condor Elevator]], which contributed to the decline and eventual collapse of Union Micro, the largest elevator company in Second Life since 2004. Various other brands were inspired during this time, but were never publicly launched, such as GBC (a news network filmed in a studio in Second Life to run on BTN) and the RPSE (a simulated stock exchange).<br />
<br />
In 2013, NTBI conceived of the [[Harrison]] roleplay sim, and most of its efforts throughout the year were aimed at creating various props and preparing buildings. Gentek released a broad update to the long-running [[IntelliDoor]], now the second most profitable NTBI product behind the [[Condor Elevator]], adding several new models. It also developed the [[IntelliLight]] system for use in Harrison, which was never publicly released.<br />
<br />
Throughout 2014, development continued on Harrison, which was eventually opened on New Year's Eve. NTBI also briefly attempted to enter the aviation market during 2014 by building an airport, but land could not be secured. NTBI also designed a commercial airliner, but could not find a modeler able to reliably complete such a demanding project. However, SZYM released the mesh [[SZYM Entourage]] alongside an update to the Intruder, both scripted with [[SPT2]], which proved to be a huge success. Will Szymborska and Nelson Jenkins also attempted to start a new brand, Jenco, which was a showroom for low-prim furniture for roleplayers to use, primarily in their Harrison rentals. However, since the furniture would be sold by third parties and Jenco was not paid, the brand was essentially abandoned. It is used occasionally for in-house products - for example, the ambient music in the Prototype Gardens Shopping Center was originally designed for Jenco under the name "Jenco Jazz".<br />
<br />
In 2015, NTBI saw the rapid rise and fall of Harrison. Because of waning interest in urban roleplay, Harrison started to become unprofitable, and several NTBI members were extremely disheartened by its ultimate closure, so productivity slowed. However, [[NBS]] was created, which absorbed Sei Computing and the [[Mark 1]] project, which was completely restarted from scratch. NTBI also continued to dabble in the aviation market, but still could not find a successful strategy to enter it.<br />
<br />
In 2016, NBS launched the [[NorPhone]] with Gentek Telecom, a subsidiary of Gentek and the creator of the original [[genPhone]] prior to NTBI, to provide operator and payphone service. 2016 also saw the relaunch of Harrison with an ambitious plan to include two more regions. However, while Harrison was opened to the public, there were few roleplayers left, so the project failed again before the two new regions could be completed. The remainder of 2016 was spent mostly on NBS and Gentek Telecom facilities, development, and service. By this time, several NTBI brands had slowed to few, if any, product releases, but maintained their stores in Prototype.<br />
<br />
2017 finally saw new additions to NTBI, with Rena (guraa) joining and launching RiDECO (a furniture and props company), BeckHan Ra joining with GEMC (a long-standing automotive company), and Faye Blackheart joining with FAYDED (another furniture and props company, which was launched in the original Harrison). The addition of these stores required an extensive expansion to the Prototype Gardens Shopping Center, completed in May.<br />
<br />
In 2018, NTBI expanded the NTBI estate to four homesteads, which served as testing grounds for various internal projects and the home of the new [[Szym Tower (building)|Szym Tower IX]]. Gentek released its [[Delta Elevator]], a long-awaited improvement upon its original [[Condor Elevator]]. NTBI resumed development on its commercial airliner project, but it was again stymied by a lack of modelers available.<br />
<br />
In 2019, the NTBI estate was consolidated into a single full region. Szym Tower IX saw some minor modifications, and the single region was slightly redesigned to accommodate features seen in the original NTBI estate.<br />
<br />
<br />
[[File:8498164791 6e23773694 o.jpg|300px|thumb|left|The NTBI Hyperion building.]]<br />
[[File:8053582228_98de1cbdfe_o.jpg|300px|thumb|right|Postcard of final [[Szym Tower (building)|Szym Tower]] built in Celaeno in late 2012. All 25 floors and 3 basements were accessible by elevator.]]<br />
[[File:7660622700 e59d44e491 o.png|300px|thumb|left|[[NTBI Celaeno Complex]] after its expansion.]]<br />
[[File:8258582757 78bbc5e9da o.png|300px|thumb|right|The original [[NTBI Development Campus]] in NTBI.]]<br />
<br />
==Purpose==<br />
<br />
NTBI's original goal was to act as a partnership for sharing services. As it progressed, NTBI began holding several land parcels, and eventually used the Prototype region as a shared location for stores. Around 2011, the original Prototype Gardens Shopping Center was built, which was redesigned three times since. The tier each member contributes to the costs for this land, as well as its web services and other subscriptions, is shared according to each member's usage and varies due to a variety of factors, such as store size, use of NTBI's in-house update system, and use of more advanced services such as Web Config.<br />
<br />
However, NTBI does not pool profits, aside from individual profit shares or payments for services provided between members, such as modeling, scripting, and texturing. Generally speaking, the profits from each brand go directly to the individual brand owner, and each brand owner controls their own brands practically exclusively. Individual members have very little control over others, and are generally free to do as they please, although members have typically agreed not to directly compete with each other.<br />
<br />
By joining together, NTBI leverages its enormous brand awareness to the success of all members. Collectively, NTBI earns around L$10-20 million in reported revenue annually. This success has allowed it to successfully branch out into brand-new markets with little to no marketing effort. However, as NTBI members have lost much of their free time to real-life careers and demands, this growth is limited. Several members estimate that with enough free time or new additions, NTBI would easily go on to dominate several other key markets - as it stands, NTBI is generally focused on the shrinking roleplay market.<br />
<br />
Despite this, NTBI maintains its strict adherence to self-perpetuated quality standards. While the overall goal of the partnership is to recognize all members as a group, the individual talents that make up the framework are critical, and being able to use them to their fullest for the benefit of all members brought NTBI to where it is today. The unrelenting attention to detail and perfectionism NTBI products show in the face of thousands of creators willing to cut corners is exemplified by the success of its most well-known products. Many NTBI members agree that the partnership's self-policing nature helped keep those strengths alive.<br />
<br />
Most NTBI members are close friends outside of Second Life and have met in-person at several "NTBI conferences", typically conducted privately in the New York metro area.<br />
<br />
<br />
==Product Variation==<br />
<br />
LMD, SZYM, Astaro, Lusch, Jupiter, and GEMC are all well-established automotive manufacturers throughout the roleplay world and beyond. All members pride themselves on all-original in-house work, something very rare in Second Life vehicles.<br />
<br />
Other brands produce a wide variety of products, such as building equipment, furniture, electronics, telecommunications, prefabricated buildings, and various roleplay equipment.<br />
<br />
<br />
==Locations==<br />
<br />
===Prototype Gardens Shopping Center===<br />
Since 2008, all NTBI affiliated brands (except LMD) have been located in the [[Prototype|Prototype region]]. The region has previously featured race tracks and various other motoring themed backdrops. In late 2011, the theme was changed to feature a large mall area housing all the different brands by all content creators in one area. In June 2012, the mall was rebuilt and expanded to house additional shops and a larger showroom for Astaro. In 2013, the mall was rebuilt again to more modern building standards. In 2017, the mall was expanded to fit new NTBI members' stores. In 2019, the Prototype region was closed after 11 years and the Prototype Gardens Shopping Center was moved to the [[NTBI (region)|NTBI region]].<br />
<br />
===NTBI Group Headquarters===<br />
NTBI's Headquarters was located in Celaeno in 2008-2009, moved to Dominatium in 2010, and then to Lionheart Mufasa in 2011 alongside [[Gentek Interregional Tower]]. In 2012, it returned to and was rebuilt at the original site in Celaeno, and [[Gentek]] merged into the same building. The [[NTBI Celaeno Complex]] housed the offices for all NTBI brands and private residences of several NTBI affiliated employees. It also featured a list of other amenities, which varied throughout the different iterations of the building. The site was expanded dramatically in mid 2012, when the rest of the block was acquired. Then, in late 2012, the building was demolished and [[Szym Tower (building)|Szym Tower VII]] was built in its place, arguably the tallest building ever built by NTBI. However, in 2013, the headquarters was moved to the [[NTBI Development Campus]] in the private [[NTBI (region)|NTBI region]]. In 2015, alongside the development of the NorPhone, the NTBI region was renamed to Northbridge and eventually connected to Prototype for public access, making the headquarters public again. Throughout this period, the Northbridge region hosted a few different buildings, each considered the NTBI headquarters for its time. In 2018, the existing Northbridge building was demolished to make way for [[Szym Tower (building)|Szym Tower IX]], which again became the NTBI headquarters. In 2019, the Northbridge region, along with the rest of the NTBI estate, was closed and replaced with a new [[NTBI (region)|NTBI region]], which hosts both the [[Prototype|Prototype Gardens Shopping Center]] and Szym Tower IX, among a variety of other buildings.<br />
<br />
NTBI also maintains an office in the Hyperion region, near the location of the original SZYM Motors store in what used to be the Teen Grid. This building serves as the secondary headquarters should the NTBI region be unavailable.<br />
<br />
<br />
==NTBI Events==<br />
NTBI has funded and hosted [[Cross Grid Rally]] twice. It is a gridwide mainland high speed rally style competition. Competitors are evaluated on how long they take to complete a stage, each event consisting of multiple stages. The rally event planning each year has called for the development of grid-way point reading HUDs, setting up and funding start and finish locations for each stage, as well as route planning and merchandise. A trial event was hosted among several NTBI members in 2007, with official large scale rallies publicly held in 2008 and 2011. Attendees are required to pay a sign-up fee for participation in the event.<br />
<br />
NTBI also hosted the Update War event in the City of [[Concord]] in 2011 for the release of the 2012 SZYM Intruder and 2012 Astaro Imperial updates. After customers bought or received the product update, they were later asked to vote for their favorite product by use of a voting booth in Prototype.<br />
<br />
NTBI has also hosted several launch parties for its major products, usually in Prototype. NTBI members also occasionally convene in Hyperion for special events.<br />
<br />
==NTBISS==<br />
The NTBI Security Service was NTBI's paid in-house protective staff for its properties and was also responsible for carrying out close protection services to important company employees. It was founded in 2008 and was in service on and off until early 2011. Members were regularly trained to handle dangerous roleplay scenarios and avoid them while visiting sensitive roleplay sims. The staff was also responsible for driving NTBI owned vehicles and managing land ban lists, handling griefing incidents, and other duties. While there are still security service employees, the full-time nature of the NTBISS program is no longer in effect as of 2012.</div>NelsonJenkinshttps://wiki.ntbigroup.com/index.php?title=Main_Page&diff=2921Main Page2020-09-25T20:14:44Z<p>NelsonJenkins: </p>
<hr />
<div>[[File:Ntbiwiki.png|center]]<br />
<div class="center" style="width:auto; margin-left:auto; margin-right:auto;">'''Welcome to NTBI'''</div><br />
<br><br />
<div class="center" style="width:auto; margin-left:auto; margin-right:auto;">[http://ntbigroup.com Return to Main Website]</div><br />
<br />
<div class="center" style="width:auto; margin-left:auto; margin-right:auto;">[[NTBI|What's NTBI?]]</div><br />
<br />
<br />
<br />
<div class="center" style="width:auto; margin-left:auto; margin-right:auto;">'''NTBI Affiliates'''<br />
{{Astaro}}<br />
{{SZYM}}<br />
{{Lusch}}<br />
{{Gentek}}<br />
{{NBS}}<br />
{{GTMD}}<br />
{{K-Ace}}<br />
{{KYOTO}}<br />
</div><br />
<br><br />
----<br />
<br><br />
<br />
{{People2}}</div>NelsonJenkinshttps://wiki.ntbigroup.com/index.php?title=InfoCenter&diff=2920InfoCenter2020-03-21T15:00:44Z<p>NelsonJenkins: </p>
<hr />
<div>{{ infobox product<br />
| title = InfoCenter<br />
| image = [[File:replaceme.jpg|200px|center]]<br />
| caption = InfoCenter Display Kit vendor image.<br />
| inventor = [[Nelson Jenkins]], [[SLI Komarov]]<br />
| launch year = 2008, upgraded in 2014<br />
| company = [[Gentek]]<br />
| available = Marketplace & In-World<br />
| url = '''[https://marketplace.secondlife.com/p/InfoCenter-Display-Kit-Four-Electronic-Text-Display-Sign-Models/6579929 InfoCenter Display Kit]'''<br>'''[https://marketplace.secondlife.com/p/InfoCenter-Mobile-Trailer-Mounted-Electronic-Text-Display-Sign/6579901 InfoCenter Mobile]'''<br />
}}<br />
<br />
The '''InfoCenter''' is a series of electronic text display signs (Personal, Notice, Highway, Matrix, and Mobile) sold by [[Gentek]]. They are designed for transportation & commercial purposes, although have been creatively used for a wide variety of applications. They are all web-controllable and include an API for scripters and web developers.<br />
<br />
This page covers the InfoCenter Series v3 and above. Because of the complexity in the new system and licensing restrictions, v3 is not a free update. For older versions, visit these pages: [[InfoCenter Mobile|Mobile]], [[InfoCenter Highway|Highway]], or [[InfoCenter Personal|Personal]]<br />
<br />
==Models==<br />
The InfoCenter is made up of two separate products - the InfoCenter Display Kit, and the InfoCenter Mobile.<br />
<br />
===InfoCenter Display Kit===<br />
The Display Kit includes the following models (in both standard and Duo variants, Duo typically doubling both the number of lines and characters per line, effectively quadrupling capacity):<br />
* '''InfoCenter Personal''' - 16 x 1 (2 LI) or 32 x 2 (5 LI) characters. Ideal for general commercial use, and includes a variety of animated graphics for stores.<br />
* '''InfoCenter Notice''' - 16 x 7 (8 LI) or 32 x 14 (29 LI) characters. The highest-capacity model, ideal for news & information. Also includes graphics for commercial & industrial purposes.<br />
* '''InfoCenter Highway''' - 16 x 3 (4 LI) or 32 x 6 (13 LI) characters. Best suited for overhead gantry installations on roads, but can be used for walkway or general commercial applications.<br />
* '''InfoCenter Matrix''' - 4 x 2 (1 LI) or 8 x 5 (3 LI) characters. A road sign display with many graphics for lane control, variable speed limits, hazard warning, detours, turn restrictions, and more.<br />
All models, excluding the Highway, have a toggleable mounting bracket. All models are modifiable (scripts excluded) and can be resized or linked (with the caveat that they cannot be linked together).<br />
<br />
===InfoCenter Mobile===<br />
The Mobile model is used for construction & road closures. 8 x 3 characters (3 LI) - the Mobile does not have a Duo variant. It is a trailer unit which can be rotated for the optimum viewing angle. It also has two trailer colors (grey & orange) and the display unit can be resized to three different sizes for different use cases. Unlike other models, the InfoCenter Mobile is not modifiable.<br />
<br />
Because of the Mobile's long-lasting popularity over other models, we sell it separately to reduce costs for those just interested in this model. Besides the features above, the Mobile is technically identical to all other models - it is web controllable and uses the same API.<br />
<br />
==Setup & Use==<br />
InfoCenter devices are ready for use out of the box. You can control some cosmetic options described above, but once they are rezzed, they can be set immediately.<br />
<br />
All InfoCenter devices are accessible through the [http://ntbigroup.com/gentek/infocenter/ InfoCenter Manager.] If you access the Manager directly, you will have to log in - you can avoid this by clicking a sign and selecting ''Web Control''. (This will also highlight the selected sign in the manager.)<br />
<br />
If you have not created an NTBI Group account before, you will be prompted to enter a password - do not use your SL password for this! Then, in the future, you can log in to the NTBI Group website (including the InfoCenter Manager) without even being in-world.<br />
<br />
===Setting a Message===<br />
You can set any of your InfoCenter devices from the InfoCenter Manager. Click the ''Set'' button, and you will be shown the message designer interface.<br />
<br />
Messages are made up of slides. Each slide can either be a text slide or a graphic slide, and can be set to display for generally any length of time you want. Slides are displayed sequentially and loop when completed.<br />
<br />
The grey number next to the model name for the device you are setting is the maximum number of slides - this is dependent on the capacity of the display, so smaller displays can handle more slides (up to 60). Some very high capacity devices (such as the Notice Duo) can only handle a few slides.<br />
<br />
When you open the message designer, the message currently displayed on that device will be shown, so you can edit it if you wish. By default, it is a single blank slide.<br />
<br />
* To add a text slide, type your message into the text cell input area. By default, the Amber color is used, but you can click any color in the palette below to select that color. Any new characters you type will then be in that color. When you're finished, click the ''Add Text'' button to add it to the slides.<br />
** Because of Javascript limitations, you must release each key before typing the next one, otherwise it won't register - type slowly and carefully!<br />
** Some characters are not permitted as text. If that is the case, they will not be entered.<br />
** For a full box character, like older InfoCenter models, use the ^ (caret) character. (This will not be shown on the website - it will only appear correctly in-world.)<br />
* To add a graphic slide, select a graphic from the dropdown. A preview will appear above it. To add the graphic, click ''Add Graphic''.<br />
* To move slides around or delete them, click the icons next to them. Keep in mind that by default, a blank slide is included as the first slide - you may want to remove it.<br />
* To change the time that a slide is shown, click ''Change'' and type in a new time (in seconds), then click ''Save''. Some high-capacity devices require longer slide times.<br />
<br />
When you're finished, click ''Send To This Device''. The message will be sent and displayed immediately in-world. For information on how the ''Send To Entire Group'' button works, read '''Using Groups''' below.<br />
<br />
===Using Templates===<br />
Templates are a way to easily save and recall messages. Say, for example, that you have 3 different messages you plan on displaying, but only one at a time, and you don't want to retype them every time. Templates allow you to save the message and load it later on that device (or any same-model device).<br />
<br />
* To save a template, design the message that you want to display, then type in a name above the ''Save As Template'' button, then click the button. If you already have a template with that name, it will be overwritten, so check first.<br />
* To load a template, click the dropdown to the right and select the template you want, then click ''Load''. To permanently delete a template, click ''Delete'' instead.<br />
<br />
===Using Groups===<br />
Groups are an easy way to control multiple devices at once. Devices can only belong to a single group at a time, but you can have multiple groups. Each group can only support one specific model.<br />
<br />
* To add a device to a group, click the ''Group'' button, then enter the name of the group you want to add it to. If the group doesn't exist, it will be created. If it does, the device will simply be added to the group.<br />
* To remove a device from a group, click the ''Group'' button, delete the text in the textbox, and then click ''OK''. This will remove it from the group. If the group no longer has any members, it will be hidden, but not technically deleted - if you recreate that group with the same name, the API key will be retained. (More information on this is in the API section.)<br />
* To rename a group, click the ''Rename'' button next to it, then enter a new group name. This will rename it without changing the API key, and all devices will remain in the group under the new name.<br />
* To set a message on an entire group, begin by setting a message on a single group member. When you're ready, click ''Send To Entire Group''. This will send the message to all group members.<br />
<br />
===Renaming & Deleting Devices===<br />
When your device is first rezzed, it will be named "Unnamed" followed by a number. Not only is this not descriptive, but it is a bit dangerous - if your display is reset for any reason, it will lose its old name and API key. To rename it, simply click the ''Rename'' button and enter a new name. You can also rename it from in-world using the ''Set Disp ID'' option.<br />
<br />
If your device disappears in-world, it will remain in the InfoCenter Manager. This is intended - it's to prevent accidentally deleting the device if the region is temporarily offline or there is a communication error. You can delete devices from the InfoCenter Manager by clicking ''Delete''. This will not delete it in-world - it will only disappear from the website and lose its API key. If you delete a display while it is still in-world and online, you will get a notification in-world.<br />
<br />
Sometimes, you may have several devices which no longer exist, but you don't want to delete them individually. To "flush" non-responsive devices, click the link at the very bottom of the page. This will individually check each device and, if it does not respond, it will be deleted automatically. Note that if a region is offline or very laggy, devices in it may be deleted without warning, so make sure all regions are OK before doing this.<br />
<br />
==Updates & Release Notes==<br />
You can update any InfoCenter product by rezzing it directly from your inventory (each one has an updater script which auto-deletes on first rez, so rezzing a used copy will not work).<br />
* '''v3.2'''<br />
** Added JSON API (backwards-compatible with earlier versions).<br />
** Improved font.<br />
** Fixed bug where graphic frame would be displayed at the same time as rendering text.<br />
* '''v3.1'''<br />
** Added chat API.<br />
* '''v3.0'''<br />
** Upgraded public release.<br />
** Rewrote everything, so old release notes are irrelevant.<br />
<br />
==API Documentation==<br />
For the legacy API, including the chat API, [[InfoCenter v3 Legacy API|see here]].<br />
<br />
The InfoCenter signs are controllable using an HTTP/JSON API. This can be used from LSL or from any software or server capable of forming JSON strings and sending HTTP requests.<br />
<br />
The API endpoint is http://ntbigroup.com/gentek/infocenter/api_json.php.<br />
<br />
A sample JSON request is as follows:<br />
<br />
{<br />
"request": "set_text",<br />
"api_key": "1234567890123456",<br />
"frames": [<br />
{<br />
"text": "Hello World!",<br />
"color": "",<br />
"align": "center",<br />
"word_wrap": true,<br />
"ignore_length": true,<br />
"time": 3<br />
},<br />
{<br />
"lines": [<br />
{<br />
"text": "ABCDEFGHIJKLMNOP",<br />
"color": "ROAYGBPWROAYGBPW",<br />
"align": "left"<br />
},<br />
{<br />
"text": "^^^^^^^^^^^^^^^^",<br />
"align": "right"<br />
}<br />
],<br />
"ignore_length": true,<br />
"time": 3<br />
},<br />
{<br />
"graphic": "Stop",<br />
"time": 3<br />
}<br />
]<br />
}<br />
<br />
===Required Key/Values===<br />
The JSON request must be an object with the following key-value pairs:<br />
<br />
* '''request''': Must be one of the following request types:<br />
** '''"set_text"''': Sets the text shown on a display or group of displays.<br />
** '''"set_name"''': Sets the name of a display or group.<br />
** '''"set_group"''': Adds or removes a display to/from a group.<br />
** '''"get_info"''': Gets information about a display or group.<br />
<br />
For '''set_text''' requests, the following key-value pairs are also required:<br />
* '''api_key''': The API key of the display or group to set. Remember to keep your API key private, because there is no other authentication.<br />
* '''frames''': An array of objects, each object being a single frame. See below for details on how these objects are defined.<br />
** Multiple frames can be sent in the same request, and they will cycle. The maximum number of frames is defined by the type of display being used. If the number of frames in the request exceeds the maximum, the server will return an error.<br />
<br />
For '''set_name''' requests, the following key-value pairs are also required:<br />
* '''api_key''': The API key of the display or group to rename.<br />
* '''name''': The new name to use. Must be between 1 and 64 characters.<br />
<br />
For '''set_group''' requests, the following key-value pairs are also required:<br />
* '''api_key''': The API key of the display to add to or remove from the group. Remember that the display and the group (if it exists) must be owned by the same user; displays cannot be added to groups owned by other users.<br />
* Only one of the following key-value pairs:<br />
** '''group_api_key''': The API key of the group to add the display to.<br />
** '''group_name''': The name of the group to add the display to. Must be between 1 and 64 characters.<br />
** '''group_remove''': Must be true to enable (JSON_TRUE in LSL). If enabled, will remove the display from its group.<br />
<br />
For '''get_info''' requests, the following key-value pair is also required:<br />
* '''api_key''': The API key of the display or group to get info about.<br />
<br />
===set_text Frame Object===<br />
Each frame must have only one of these required key-value pairs:<br />
<br />
* '''text''': A string of text to display.<br />
* '''lines''': An array of objects, each object being a single line on the display. Allows more precision in where text is displayed.<br />
* '''graphic''': The name of a graphic supported by this display (see below).<br />
<br />
The key-value above used determines which type of frame it is, which determines which options are available.<br />
<br />
====set_text Text Frame Type====<br />
A '''text''' frame type can have the following options:<br />
<br />
* '''text''': Required. A string of text to display.<br />
* '''color''': Optional. A color string (see below). If an empty string or not defined, "A" is used.<br />
** If the color string is shorter than the text string, the rest of the text uses the last color character.<br />
** If '''word_wrap''' is enabled, the entire frame will only be the color of the last color character due to technical limitations.<br />
* '''align''': Optional. Either "left", "center", or "right". Can also be "l", "c", or "r". If not defined, aligned to left.<br />
** If '''word_wrap''' is enabled, this will align each line. If it is disabled, this will only align the last line, because the lines before it (if any) will be the full width of the display.<br />
* '''word_wrap''': Optional. Must be true to enable (JSON_TRUE in LSL). If enabled, words are wrapped naturally. If disabled or not defined, text is "hard" wrapped to the full width of the display. It is a good idea to enable '''ignore_length''' to avoid errors if words wrap beyond the limits of the display.<br />
* '''ignore_length''': Optional. Must be true to enable (JSON_TRUE in LSL). If enabled, the server will not check the length of the text. If disabled or not defined, the server will return an error if the text exceeds the maximum the display can show.<br />
* '''time''': Optional. A length of time in seconds, between 1 and 3600, to display the frame. If not defined, the time will default to 5 seconds.<br />
** The server does not check the minimum time it would take to render the display, so very short frame times may produce unintended results.<br />
<br />
====set_text Lines Frame Type====<br />
A '''lines''' frame type can have the following options:<br />
<br />
* '''lines''': Required. An array of objects, each object being a single line on the display. Allows more precision in where text is displayed. Each line can have the following options:<br />
** '''text''': Required. A string of text to display on the line.<br />
** '''color''': Optional. Optional. A color string (see below). If the color string is shorter than the text string, the rest of the text uses the last color character. If the '''color''' option is not defined or is empty, "A" is used. If an invalid character is used, it is replaced with "W".<br />
** '''align''': Optional. Either "left", "center", or "right". Can also be "l", "c", or "r". If not defined, aligned to left.<br />
* '''ignore_length''': Optional. Must be true to enable (JSON_TRUE in LSL). If enabled, the server will not check the length of the text on each line, nor will it check the number of lines included in the request. If disabled or not defined, the server will return an error if the text exceeds the maximum the display can show in either dimension.<br />
* '''time''': Optional. A length of time in seconds, between 1 and 3600, to display the frame. If not defined, the time will default to 5 seconds.<br />
** The server does not check the minimum time it would take to render the display, so very short frame times may produce unintended results.<br />
<br />
====set_text Graphic Frame Type====<br />
A '''graphic''' frame type can have the following options:<br />
<br />
* '''graphic''': The name of a graphic supported by this display. This is case-insensitive, but must otherwise be an exact match to a supported graphic, or the server will return an error. The supported graphics are as follows:<br />
** ''InfoCenter Highway'': "Stop", "Hazard", "Do Not Enter"<br />
** ''InfoCenter Matrix'': "Stop", "Hazard", "Do Not Enter", "Detour Left", "Detour Right", "Lane Open Down", "Lane Open Up", "Lane Closed", "Lane Left Down", "Lane Right Down", "Lane Left Up", "Lane Right Up", "One Way Left", "One Way Right", "Yield", "Do Not Pass", "Stay In Lane", "No Trucks", "Trucks OK", "Speed Limit 5", "Speed Limit 10", "Speed Limit 15", "Speed Limit 20", "Speed Limit 25", "Speed Limit 30", "Speed Limit 35", "Speed Limit 40", "Speed Limit 45", "Speed Limit 50", "Speed Limit 55", "Speed Limit 60", "Speed Limit 65", "Speed Limit 70", "Speed Limit 75", "Speed Limit 80", "Keep Right", "Keep Left", "No Right Turn", "No Left/U Turn", "No Left Turn", "No U Turn", "Straight Or Left", "Straight Or Right", "Straight Only", "Left Turn Only", "Right Turn Only", "No Turns"<br />
** ''InfoCenter Notice'': "Information", "Today's Events", "Huge Sale", "Discounts", "Best Deals", "Notice", "Warning", "Danger"<br />
** ''InfoCenter Personal'': "Sale", "Come On In", "News Flash", "Happy 4th", "Welcome", "Open", "Closed", "Thank You", "No Smoking"<br />
** ''InfoCenter Mobile'': "Stop", "Hazard", "Do Not Enter", "Chase Right", "Chase Left", "Arrow Right", "Arrow Left", "Flash Right", "Flash Left", "Chevron Right", "Chevron Left", "Arrow Split", "Flash Split", "Flagger", "Stop Left", "Stop Right", "Detour Left", "Detour Right"<br />
* '''time''': Optional. A length of time in seconds, between 1 and 3600, to display the frame. If not defined, the time will default to 5 seconds.<br />
<br />
===HTTP Request Format===<br />
The required URL, as part of an LSL HTTP request, is as follows:<br />
<br />
llHTTPRequest("<nowiki>http://ntbigroup.com/gentek/infocenter/api_json.php</nowiki>", [HTTP_METHOD, "PUT"], json_request);<br />
<br />
This URL is also accessible from any web server.<br />
<br />
===HTTP Response Format===<br />
The server returns a JSON object with the following key-value pairs:<br />
<br />
* '''api''': Always "infocenter_json".<br />
* '''status''': Either "ok" or "error".<br />
* '''error''': An error number. Only included if '''status''' is "error". Include this number if possible when contacting support.<br />
* '''text''': A textual status response. If successful, will include how many displays/groups succeeded and failed. If failed, will include a human-readable error message.<br />
<br />
For '''get_info''' requests, the following key-value pairs are also returned:<br />
* '''api_key_type''': Either "display" or "group".<br />
* '''name''': The name of the display or group.<br />
* '''owner''': The owner of the display or group.<br />
* '''uuid''': The UUID of the display. Only included if '''api_key_type''' is '''"display"'''.<br />
* '''location''': The location of the display in the format <code>Region Name (128, 128, 20)</code>. May not be accurate if the display has been moved since it was rezzed. Only included if '''api_key_type''' is '''"display"'''.<br />
* '''group''': The group that the display is in. If the display is not in a group, an empty string is returned. Only included if '''api_key_type''' is '''"display"'''.<br />
* '''type''': The display type, such as "InfoCenter Mobile", for the display or group.<br />
* '''cols''': The number of columns in each row of the display or group type.<br />
* '''rows''': The number of rows of characters that the display or group type can show.<br />
* '''frames''': The maximum number of frames that the display or group type can show.<br />
* '''displays''': An array of API keys of displays in the group. Only included if '''api_key_type''' is '''"group"'''.<br />
<br />
===LSL Sample===<br />
A sample LSL script, implementing the JSON sample above, is below:<br />
<br />
key api_request;<br />
default<br />
{<br />
state_entry()<br />
{<br />
string json_request = llList2Json(JSON_OBJECT, [<br />
"request", "\"set_text\"",<br />
"api_key", "\"1234567890123456\"",<br />
"frames", llList2Json(JSON_ARRAY, [<br />
llList2Json(JSON_OBJECT, [<br />
"text", "\"Hello World!\"",<br />
"color", "",<br />
"align", "center",<br />
"word_wrap", JSON_TRUE,<br />
"ignore_length", JSON_TRUE,<br />
"time", 3<br />
]),<br />
llList2Json(JSON_OBJECT, [<br />
"lines", llList2Json(JSON_ARRAY, [<br />
llList2Json(JSON_OBJECT, [<br />
"text", "\"ABCDEFGHIJKLMNOP\"",<br />
"color", "\"ROAYGBPWROAYGBPW\"",<br />
"align", "left"<br />
]),<br />
llList2Json(JSON_OBJECT, [<br />
"text", "\"^^^^^^^^^^^^^^^^\"",<br />
"align", "r"<br />
])<br />
]),<br />
"ignore_length", JSON_TRUE,<br />
"time", 5<br />
]),<br />
llList2Json(JSON_OBJECT, [<br />
"graphic", "\"Stop\"",<br />
"time", 3<br />
])<br />
])<br />
]);<br />
api_request = llHTTPRequest("<nowiki>http://ntbigroup.com/gentek/infocenter/api_json.php</nowiki>", [HTTP_METHOD, "PUT"], json_request);<br />
}<br />
http_response(key request_id, integer status, list metadata, string body)<br />
{<br />
if (request_id == api_request)<br />
{<br />
api_request = NULL_KEY;<br />
if (status == 200) llOwnerSay("Response: " + body);<br />
else llOwnerSay("Server error. (" + (string)status + ")");<br />
}<br />
}<br />
}<br />
<br />
Note that LSL's JSON handling requires you to wrap values in escaped quotes, like so:<br />
<br />
["request", "\"set_text\""]<br />
<br />
You do not need to wrap keys in escaped quotes because the specification does not include any keys that could be interpreted as raw JSON.<br />
<br />
{{Gentek}}</div>NelsonJenkinshttps://wiki.ntbigroup.com/index.php?title=InfoCenter&diff=2919InfoCenter2020-03-14T20:45:38Z<p>NelsonJenkins: /* API Documentation */</p>
<hr />
<div>{{ infobox product<br />
| title = InfoCenter<br />
| image = [[File:replaceme.jpg|200px|center]]<br />
| caption = InfoCenter Display Kit vendor image.<br />
| inventor = [[Nelson Jenkins]], [[SLI Komarov]]<br />
| launch year = 2008, upgraded in 2014<br />
| company = [[Gentek]]<br />
| available = Marketplace & In-World<br />
| url = '''[https://marketplace.secondlife.com/p/InfoCenter-Display-Kit-Four-Electronic-Text-Display-Sign-Models/6579929 InfoCenter Display Kit]'''<br>'''[https://marketplace.secondlife.com/p/InfoCenter-Mobile-Trailer-Mounted-Electronic-Text-Display-Sign/6579901 InfoCenter Mobile]'''<br />
}}<br />
<br />
The '''InfoCenter''' is a series of electronic text display signs (Personal, Notice, Highway, Matrix, and Mobile) sold by [[Gentek]]. They are designed for transportation & commercial purposes, although have been creatively used for a wide variety of applications. They are all web-controllable and include an API for scripters and web developers.<br />
<br />
This page covers the InfoCenter Series v3 and above. Because of the complexity in the new system and licensing restrictions, v3 is not a free update. For older versions, visit these pages: [[InfoCenter Mobile|Mobile]], [[InfoCenter Highway|Highway]], or [[InfoCenter Personal|Personal]]<br />
<br />
==Models==<br />
The InfoCenter is made up of two separate products - the InfoCenter Display Kit, and the InfoCenter Mobile.<br />
<br />
===InfoCenter Display Kit===<br />
The Display Kit includes the following models (in both standard and Duo variants, Duo typically doubling both the number of lines and characters per line, effectively quadrupling capacity):<br />
* '''InfoCenter Personal''' - 16 x 1 (2 LI) or 32 x 2 (5 LI) characters. Ideal for general commercial use, and includes a variety of animated graphics for stores.<br />
* '''InfoCenter Notice''' - 16 x 7 (8 LI) or 32 x 14 (29 LI) characters. The highest-capacity model, ideal for news & information. Also includes graphics for commercial & industrial purposes.<br />
* '''InfoCenter Highway''' - 16 x 3 (4 LI) or 32 x 6 (13 LI) characters. Best suited for overhead gantry installations on roads, but can be used for walkway or general commercial applications.<br />
* '''InfoCenter Matrix''' - 4 x 2 (1 LI) or 8 x 5 (3 LI) characters. A road sign display with many graphics for lane control, variable speed limits, hazard warning, detours, turn restrictions, and more.<br />
All models, excluding the Highway, have a toggleable mounting bracket. All models are modifiable (scripts excluded) and can be resized or linked (with the caveat that they cannot be linked together).<br />
<br />
===InfoCenter Mobile===<br />
The Mobile model is used for construction & road closures. 8 x 3 characters (3 LI) - the Mobile does not have a Duo variant. It is a trailer unit which can be rotated for the optimum viewing angle. It also has two trailer colors (grey & orange) and the display unit can be resized to three different sizes for different use cases. Unlike other models, the InfoCenter Mobile is not modifiable.<br />
<br />
Because of the Mobile's long-lasting popularity over other models, we sell it separately to reduce costs for those just interested in this model. Besides the features above, the Mobile is technically identical to all other models - it is web controllable and uses the same API.<br />
<br />
==Setup & Use==<br />
InfoCenter devices are ready for use out of the box. You can control some cosmetic options described above, but once they are rezzed, they can be set immediately.<br />
<br />
All InfoCenter devices are accessible through the [http://ntbigroup.com/gentek/infocenter/ InfoCenter Manager.] If you access the Manager directly, you will have to log in - you can avoid this by clicking a sign and selecting ''Web Control''. (This will also highlight the selected sign in the manager.)<br />
<br />
If you have not created an NTBI Group account before, you will be prompted to enter a password - do not use your SL password for this! Then, in the future, you can log in to the NTBI Group website (including the InfoCenter Manager) without even being in-world.<br />
<br />
===Setting a Message===<br />
You can set any of your InfoCenter devices from the InfoCenter Manager. Click the ''Set'' button, and you will be shown the message designer interface.<br />
<br />
Messages are made up of slides. Each slide can either be a text slide or a graphic slide, and can be set to display for generally any length of time you want. Slides are displayed sequentially and loop when completed.<br />
<br />
The grey number next to the model name for the device you are setting is the maximum number of slides - this is dependent on the capacity of the display, so smaller displays can handle more slides (up to 60). Some very high capacity devices (such as the Notice Duo) can only handle a few slides.<br />
<br />
When you open the message designer, the message currently displayed on that device will be shown, so you can edit it if you wish. By default, it is a single blank slide.<br />
<br />
* To add a text slide, type your message into the text cell input area. By default, the Amber color is used, but you can click any color in the palette below to select that color. Any new characters you type will then be in that color. When you're finished, click the ''Add Text'' button to add it to the slides.<br />
** Because of Javascript limitations, you must release each key before typing the next one, otherwise it won't register - type slowly and carefully!<br />
** Some characters are not permitted as text. If that is the case, they will not be entered.<br />
** For a full box character, like older InfoCenter models, use the ^ (caret) character. (This will not be shown on the website - it will only appear correctly in-world.)<br />
* To add a graphic slide, select a graphic from the dropdown. A preview will appear above it. To add the graphic, click ''Add Graphic''.<br />
* To move slides around or delete them, click the icons next to them. Keep in mind that by default, a blank slide is included as the first slide - you may want to remove it.<br />
* To change the time that a slide is shown, click ''Change'' and type in a new time (in seconds), then click ''Save''. Some high-capacity devices require longer slide times.<br />
<br />
When you're finished, click ''Send To This Device''. The message will be sent and displayed immediately in-world. For information on how the ''Send To Entire Group'' button works, read '''Using Groups''' below.<br />
<br />
===Using Templates===<br />
Templates are a way to easily save and recall messages. Say, for example, that you have 3 different messages you plan on displaying, but only one at a time, and you don't want to retype them every time. Templates allow you to save the message and load it later on that device (or any same-model device).<br />
<br />
* To save a template, design the message that you want to display, then type in a name above the ''Save As Template'' button, then click the button. If you already have a template with that name, it will be overwritten, so check first.<br />
* To load a template, click the dropdown to the right and select the template you want, then click ''Load''. To permanently delete a template, click ''Delete'' instead.<br />
<br />
===Using Groups===<br />
Groups are an easy way to control multiple devices at once. Devices can only belong to a single group at a time, but you can have multiple groups. Each group can only support one specific model.<br />
<br />
* To add a device to a group, click the ''Group'' button, then enter the name of the group you want to add it to. If the group doesn't exist, it will be created. If it does, the device will simply be added to the group.<br />
* To remove a device from a group, click the ''Group'' button, delete the text in the textbox, and then click ''OK''. This will remove it from the group. If the group no longer has any members, it will be hidden, but not technically deleted - if you recreate that group with the same name, the API key will be retained. (More information on this is in the API section.)<br />
* To rename a group, click the ''Rename'' button next to it, then enter a new group name. This will rename it without changing the API key, and all devices will remain in the group under the new name.<br />
* To set a message on an entire group, begin by setting a message on a single group member. When you're ready, click ''Send To Entire Group''. This will send the message to all group members.<br />
<br />
===Renaming & Deleting Devices===<br />
When your device is first rezzed, it will be named "Unnamed" followed by a number. Not only is this not descriptive, but it is a bit dangerous - if your display is reset for any reason, it will lose its old name and API key. To rename it, simply click the ''Rename'' button and enter a new name. You can also rename it from in-world using the ''Set Disp ID'' option.<br />
<br />
If your device disappears in-world, it will remain in the InfoCenter Manager. This is intended - it's to prevent accidentally deleting the device if the region is temporarily offline or there is a communication error. You can delete devices from the InfoCenter Manager by clicking ''Delete''. This will not delete it in-world - it will only disappear from the website and lose its API key. If you delete a display while it is still in-world and online, you will get a notification in-world.<br />
<br />
Sometimes, you may have several devices which no longer exist, but you don't want to delete them individually. To "flush" non-responsive devices, click the link at the very bottom of the page. This will individually check each device and, if it does not respond, it will be deleted automatically. Note that if a region is offline or very laggy, devices in it may be deleted without warning, so make sure all regions are OK before doing this.<br />
<br />
==Updates & Release Notes==<br />
You can update any InfoCenter product by rezzing it directly from your inventory (each one has an updater script which auto-deletes on first rez, so rezzing a used copy will not work).<br />
* '''v3.2'''<br />
** Added JSON API (backwards-compatible with earlier versions).<br />
** Improved font.<br />
** Fixed bug where graphic frame would be displayed at the same time as rendering text.<br />
* '''v3.1'''<br />
** Added chat API.<br />
* '''v3.0'''<br />
** Upgraded public release.<br />
** Rewrote everything, so old release notes are irrelevant.<br />
<br />
==API Documentation==<br />
For the legacy API, including the chat API, [[InfoCenter v3 Legacy API|see here]].<br />
<br />
The InfoCenter signs are controllable using an HTTP/JSON API. This can be used from LSL or from any software or server capable of forming JSON strings and sending HTTP requests.<br />
<br />
The API endpoint is http://ntbigroup.com/gentek/infocenter/api_json.php.<br />
<br />
A sample JSON request is as follows:<br />
<br />
{<br />
"request": "set_text",<br />
"api_key": "1234567890123456",<br />
"frames": [<br />
{<br />
"text": "Hello World!",<br />
"color": "",<br />
"align": "center",<br />
"word_wrap": true,<br />
"ignore_length": true,<br />
"time": 3<br />
},<br />
{<br />
"lines": [<br />
{<br />
"text": "ABCDEFGHIJKLMNOP",<br />
"color": "ROAYGBPWROAYGBPW",<br />
"align": "left"<br />
},<br />
{<br />
"text": "^^^^^^^^^^^^^^^^",<br />
"align": "right"<br />
}<br />
],<br />
"ignore_length": true,<br />
"time": 3<br />
},<br />
{<br />
"graphic": "Stop",<br />
"time": 3<br />
}<br />
]<br />
}<br />
<br />
===Required Key/Values===<br />
The JSON request must be an object with the following key-value pairs:<br />
<br />
* '''request''': Must be "set_text".<br />
* '''api_key''': The API key of the display or group to set. Remember to keep your API key private, because there is no other authentication.<br />
* '''frames''': An array of objects, each object being a single frame.<br />
** Multiple frames can be sent in the same request, and they will cycle. The maximum number of frames is defined by the type of display being used. If the number of frames in the request exceeds the maximum, the server will return an error.<br />
<br />
===Frame Object===<br />
Each frame must have only one of these required key-value pairs:<br />
<br />
* '''text''': A string of text to display.<br />
* '''lines''': An array of objects, each object being a single line on the display. Allows more precision in where text is displayed.<br />
* '''graphic''': The name of a graphic supported by this display (see below).<br />
<br />
The key-value above used determines which type of frame it is, which determines which options are available.<br />
<br />
====Text Frame Type====<br />
A '''text''' frame type can have the following options:<br />
<br />
* '''text''': Required. A string of text to display.<br />
* '''color''': Optional. A color string (see below). If an empty string or not defined, "A" is used.<br />
** If the color string is shorter than the text string, the rest of the text uses the last color character.<br />
** If '''word_wrap''' is enabled, the entire frame will only be the color of the last color character due to technical limitations.<br />
* '''align''': Optional. Either "left", "center", or "right". Can also be "l", "c", or "r". If not defined, aligned to left.<br />
** If '''word_wrap''' is enabled, this will align each line. If it is disabled, this will only align the last line, because the lines before it (if any) will be the full width of the display.<br />
* '''word_wrap''': Optional. Must be true to enable (JSON_TRUE in LSL). If enabled, words are wrapped naturally. If disabled or not defined, text is "hard" wrapped to the full width of the display. It is a good idea to enable '''ignore_length''' to avoid errors if words wrap beyond the limits of the display.<br />
* '''ignore_length''': Optional. Must be true to enable (JSON_TRUE in LSL). If enabled, the server will not check the length of the text. If disabled or not defined, the server will return an error if the text exceeds the maximum the display can show.<br />
* '''time''': Optional. A length of time in seconds, between 1 and 3600, to display the frame. If not defined, the time will default to 5 seconds.<br />
** The server does not check the minimum time it would take to render the display, so very short frame times may produce unintended results.<br />
<br />
====Lines Frame Type====<br />
A '''lines''' frame type can have the following options:<br />
<br />
* '''lines''': Required. An array of objects, each object being a single line on the display. Allows more precision in where text is displayed. Each line can have the following options:<br />
** '''text''': Required. A string of text to display on the line.<br />
** '''color''': Optional. Optional. A color string (see below). If the color string is shorter than the text string, the rest of the text uses the last color character. If the '''color''' option is not defined or is empty, "A" is used. If an invalid character is used, it is replaced with "W".<br />
** '''align''': Optional. Either "left", "center", or "right". Can also be "l", "c", or "r". If not defined, aligned to left.<br />
* '''ignore_length''': Optional. Must be true to enable (JSON_TRUE in LSL). If enabled, the server will not check the length of the text on each line, nor will it check the number of lines included in the request. If disabled or not defined, the server will return an error if the text exceeds the maximum the display can show in either dimension.<br />
* '''time''': Optional. A length of time in seconds, between 1 and 3600, to display the frame. If not defined, the time will default to 5 seconds.<br />
** The server does not check the minimum time it would take to render the display, so very short frame times may produce unintended results.<br />
<br />
====Graphic Frame Type====<br />
A '''graphic''' frame type can have the following options:<br />
<br />
* '''graphic''': The name of a graphic supported by this display. This is case-insensitive, but must otherwise be an exact match to a supported graphic, or the server will return an error. The supported graphics are as follows:<br />
** ''InfoCenter Highway'': "Stop", "Hazard", "Do Not Enter"<br />
** ''InfoCenter Matrix'': "Stop", "Hazard", "Do Not Enter", "Detour Left", "Detour Right", "Lane Open Down", "Lane Open Up", "Lane Closed", "Lane Left Down", "Lane Right Down", "Lane Left Up", "Lane Right Up", "One Way Left", "One Way Right", "Yield", "Do Not Pass", "Stay In Lane", "No Trucks", "Trucks OK", "Speed Limit 5", "Speed Limit 10", "Speed Limit 15", "Speed Limit 20", "Speed Limit 25", "Speed Limit 30", "Speed Limit 35", "Speed Limit 40", "Speed Limit 45", "Speed Limit 50", "Speed Limit 55", "Speed Limit 60", "Speed Limit 65", "Speed Limit 70", "Speed Limit 75", "Speed Limit 80", "Keep Right", "Keep Left", "No Right Turn", "No Left/U Turn", "No Left Turn", "No U Turn", "Straight Or Left", "Straight Or Right", "Straight Only", "Left Turn Only", "Right Turn Only", "No Turns"<br />
** ''InfoCenter Notice'': "Information", "Today's Events", "Huge Sale", "Discounts", "Best Deals", "Notice", "Warning", "Danger"<br />
** ''InfoCenter Personal'': "Sale", "Come On In", "News Flash", "Happy 4th", "Welcome", "Open", "Closed", "Thank You", "No Smoking"<br />
** ''InfoCenter Mobile'': "Stop", "Hazard", "Do Not Enter", "Chase Right", "Chase Left", "Arrow Right", "Arrow Left", "Flash Right", "Flash Left", "Chevron Right", "Chevron Left", "Arrow Split", "Flash Split", "Flagger", "Stop Left", "Stop Right", "Detour Left", "Detour Right"<br />
* '''time''': Optional. A length of time in seconds, between 1 and 3600, to display the frame. If not defined, the time will default to 5 seconds.<br />
<br />
===HTTP Request Format===<br />
The required URL, as part of an LSL HTTP request, is as follows:<br />
<br />
llHTTPRequest("<nowiki>http://ntbigroup.com/gentek/infocenter/api_json.php</nowiki>", [HTTP_METHOD, "PUT"], json_request);<br />
<br />
This URL is also accessible from any web server.<br />
<br />
===HTTP Response Format===<br />
The server returns a JSON object with the following key-value pairs:<br />
<br />
* '''api''': Always "infocenter_json".<br />
* '''status''': Either "ok" or "error".<br />
* '''error''': An error number. Only included if '''status''' is "error". Include this number if possible when contacting support.<br />
* '''text''': A textual status response. If successful, will include how many displays succeeded and failed. If failed, will include a human-readable error message.<br />
<br />
===LSL Sample===<br />
A sample LSL script, implementing the JSON sample above, is below:<br />
<br />
key api_request;<br />
default<br />
{<br />
state_entry()<br />
{<br />
string json_request = llList2Json(JSON_OBJECT, [<br />
"request", "\"set_text\"",<br />
"api_key", "\"1234567890123456\"",<br />
"frames", llList2Json(JSON_ARRAY, [<br />
llList2Json(JSON_OBJECT, [<br />
"text", "\"Hello World!\"",<br />
"color", "",<br />
"align", "center",<br />
"word_wrap", JSON_TRUE,<br />
"ignore_length", JSON_TRUE,<br />
"time", 3<br />
]),<br />
llList2Json(JSON_OBJECT, [<br />
"lines", llList2Json(JSON_ARRAY, [<br />
llList2Json(JSON_OBJECT, [<br />
"text", "\"ABCDEFGHIJKLMNOP\"",<br />
"color", "\"ROAYGBPWROAYGBPW\"",<br />
"align", "left"<br />
]),<br />
llList2Json(JSON_OBJECT, [<br />
"text", "\"^^^^^^^^^^^^^^^^\"",<br />
"align", "r"<br />
])<br />
]),<br />
"ignore_length", JSON_TRUE,<br />
"time", 5<br />
]),<br />
llList2Json(JSON_OBJECT, [<br />
"graphic", "\"Stop\"",<br />
"time", 3<br />
])<br />
])<br />
]);<br />
api_request = llHTTPRequest("<nowiki>http://ntbigroup.com/gentek/infocenter/api_json.php</nowiki>", [HTTP_METHOD, "PUT"], json_request);<br />
}<br />
http_response(key request_id, integer status, list metadata, string body)<br />
{<br />
if (request_id == api_request)<br />
{<br />
api_request = NULL_KEY;<br />
if (status == 200) llOwnerSay("Response: " + body);<br />
else llOwnerSay("Server error. (" + (string)status + ")");<br />
}<br />
}<br />
}<br />
<br />
Note that LSL's JSON handling requires you to wrap values in escaped quotes, like so:<br />
<br />
["request", "\"set_text\""]<br />
<br />
You do not need to wrap keys in escaped quotes because the specification does not include any keys that could be interpreted as raw JSON.<br />
<br />
{{Gentek}}</div>NelsonJenkinshttps://wiki.ntbigroup.com/index.php?title=InfoCenter&diff=2918InfoCenter2020-03-14T20:45:21Z<p>NelsonJenkins: /* API Documentation */</p>
<hr />
<div>{{ infobox product<br />
| title = InfoCenter<br />
| image = [[File:replaceme.jpg|200px|center]]<br />
| caption = InfoCenter Display Kit vendor image.<br />
| inventor = [[Nelson Jenkins]], [[SLI Komarov]]<br />
| launch year = 2008, upgraded in 2014<br />
| company = [[Gentek]]<br />
| available = Marketplace & In-World<br />
| url = '''[https://marketplace.secondlife.com/p/InfoCenter-Display-Kit-Four-Electronic-Text-Display-Sign-Models/6579929 InfoCenter Display Kit]'''<br>'''[https://marketplace.secondlife.com/p/InfoCenter-Mobile-Trailer-Mounted-Electronic-Text-Display-Sign/6579901 InfoCenter Mobile]'''<br />
}}<br />
<br />
The '''InfoCenter''' is a series of electronic text display signs (Personal, Notice, Highway, Matrix, and Mobile) sold by [[Gentek]]. They are designed for transportation & commercial purposes, although have been creatively used for a wide variety of applications. They are all web-controllable and include an API for scripters and web developers.<br />
<br />
This page covers the InfoCenter Series v3 and above. Because of the complexity in the new system and licensing restrictions, v3 is not a free update. For older versions, visit these pages: [[InfoCenter Mobile|Mobile]], [[InfoCenter Highway|Highway]], or [[InfoCenter Personal|Personal]]<br />
<br />
==Models==<br />
The InfoCenter is made up of two separate products - the InfoCenter Display Kit, and the InfoCenter Mobile.<br />
<br />
===InfoCenter Display Kit===<br />
The Display Kit includes the following models (in both standard and Duo variants, Duo typically doubling both the number of lines and characters per line, effectively quadrupling capacity):<br />
* '''InfoCenter Personal''' - 16 x 1 (2 LI) or 32 x 2 (5 LI) characters. Ideal for general commercial use, and includes a variety of animated graphics for stores.<br />
* '''InfoCenter Notice''' - 16 x 7 (8 LI) or 32 x 14 (29 LI) characters. The highest-capacity model, ideal for news & information. Also includes graphics for commercial & industrial purposes.<br />
* '''InfoCenter Highway''' - 16 x 3 (4 LI) or 32 x 6 (13 LI) characters. Best suited for overhead gantry installations on roads, but can be used for walkway or general commercial applications.<br />
* '''InfoCenter Matrix''' - 4 x 2 (1 LI) or 8 x 5 (3 LI) characters. A road sign display with many graphics for lane control, variable speed limits, hazard warning, detours, turn restrictions, and more.<br />
All models, excluding the Highway, have a toggleable mounting bracket. All models are modifiable (scripts excluded) and can be resized or linked (with the caveat that they cannot be linked together).<br />
<br />
===InfoCenter Mobile===<br />
The Mobile model is used for construction & road closures. 8 x 3 characters (3 LI) - the Mobile does not have a Duo variant. It is a trailer unit which can be rotated for the optimum viewing angle. It also has two trailer colors (grey & orange) and the display unit can be resized to three different sizes for different use cases. Unlike other models, the InfoCenter Mobile is not modifiable.<br />
<br />
Because of the Mobile's long-lasting popularity over other models, we sell it separately to reduce costs for those just interested in this model. Besides the features above, the Mobile is technically identical to all other models - it is web controllable and uses the same API.<br />
<br />
==Setup & Use==<br />
InfoCenter devices are ready for use out of the box. You can control some cosmetic options described above, but once they are rezzed, they can be set immediately.<br />
<br />
All InfoCenter devices are accessible through the [http://ntbigroup.com/gentek/infocenter/ InfoCenter Manager.] If you access the Manager directly, you will have to log in - you can avoid this by clicking a sign and selecting ''Web Control''. (This will also highlight the selected sign in the manager.)<br />
<br />
If you have not created an NTBI Group account before, you will be prompted to enter a password - do not use your SL password for this! Then, in the future, you can log in to the NTBI Group website (including the InfoCenter Manager) without even being in-world.<br />
<br />
===Setting a Message===<br />
You can set any of your InfoCenter devices from the InfoCenter Manager. Click the ''Set'' button, and you will be shown the message designer interface.<br />
<br />
Messages are made up of slides. Each slide can either be a text slide or a graphic slide, and can be set to display for generally any length of time you want. Slides are displayed sequentially and loop when completed.<br />
<br />
The grey number next to the model name for the device you are setting is the maximum number of slides - this is dependent on the capacity of the display, so smaller displays can handle more slides (up to 60). Some very high capacity devices (such as the Notice Duo) can only handle a few slides.<br />
<br />
When you open the message designer, the message currently displayed on that device will be shown, so you can edit it if you wish. By default, it is a single blank slide.<br />
<br />
* To add a text slide, type your message into the text cell input area. By default, the Amber color is used, but you can click any color in the palette below to select that color. Any new characters you type will then be in that color. When you're finished, click the ''Add Text'' button to add it to the slides.<br />
** Because of Javascript limitations, you must release each key before typing the next one, otherwise it won't register - type slowly and carefully!<br />
** Some characters are not permitted as text. If that is the case, they will not be entered.<br />
** For a full box character, like older InfoCenter models, use the ^ (caret) character. (This will not be shown on the website - it will only appear correctly in-world.)<br />
* To add a graphic slide, select a graphic from the dropdown. A preview will appear above it. To add the graphic, click ''Add Graphic''.<br />
* To move slides around or delete them, click the icons next to them. Keep in mind that by default, a blank slide is included as the first slide - you may want to remove it.<br />
* To change the time that a slide is shown, click ''Change'' and type in a new time (in seconds), then click ''Save''. Some high-capacity devices require longer slide times.<br />
<br />
When you're finished, click ''Send To This Device''. The message will be sent and displayed immediately in-world. For information on how the ''Send To Entire Group'' button works, read '''Using Groups''' below.<br />
<br />
===Using Templates===<br />
Templates are a way to easily save and recall messages. Say, for example, that you have 3 different messages you plan on displaying, but only one at a time, and you don't want to retype them every time. Templates allow you to save the message and load it later on that device (or any same-model device).<br />
<br />
* To save a template, design the message that you want to display, then type in a name above the ''Save As Template'' button, then click the button. If you already have a template with that name, it will be overwritten, so check first.<br />
* To load a template, click the dropdown to the right and select the template you want, then click ''Load''. To permanently delete a template, click ''Delete'' instead.<br />
<br />
===Using Groups===<br />
Groups are an easy way to control multiple devices at once. Devices can only belong to a single group at a time, but you can have multiple groups. Each group can only support one specific model.<br />
<br />
* To add a device to a group, click the ''Group'' button, then enter the name of the group you want to add it to. If the group doesn't exist, it will be created. If it does, the device will simply be added to the group.<br />
* To remove a device from a group, click the ''Group'' button, delete the text in the textbox, and then click ''OK''. This will remove it from the group. If the group no longer has any members, it will be hidden, but not technically deleted - if you recreate that group with the same name, the API key will be retained. (More information on this is in the API section.)<br />
* To rename a group, click the ''Rename'' button next to it, then enter a new group name. This will rename it without changing the API key, and all devices will remain in the group under the new name.<br />
* To set a message on an entire group, begin by setting a message on a single group member. When you're ready, click ''Send To Entire Group''. This will send the message to all group members.<br />
<br />
===Renaming & Deleting Devices===<br />
When your device is first rezzed, it will be named "Unnamed" followed by a number. Not only is this not descriptive, but it is a bit dangerous - if your display is reset for any reason, it will lose its old name and API key. To rename it, simply click the ''Rename'' button and enter a new name. You can also rename it from in-world using the ''Set Disp ID'' option.<br />
<br />
If your device disappears in-world, it will remain in the InfoCenter Manager. This is intended - it's to prevent accidentally deleting the device if the region is temporarily offline or there is a communication error. You can delete devices from the InfoCenter Manager by clicking ''Delete''. This will not delete it in-world - it will only disappear from the website and lose its API key. If you delete a display while it is still in-world and online, you will get a notification in-world.<br />
<br />
Sometimes, you may have several devices which no longer exist, but you don't want to delete them individually. To "flush" non-responsive devices, click the link at the very bottom of the page. This will individually check each device and, if it does not respond, it will be deleted automatically. Note that if a region is offline or very laggy, devices in it may be deleted without warning, so make sure all regions are OK before doing this.<br />
<br />
==Updates & Release Notes==<br />
You can update any InfoCenter product by rezzing it directly from your inventory (each one has an updater script which auto-deletes on first rez, so rezzing a used copy will not work).<br />
* '''v3.2'''<br />
** Added JSON API (backwards-compatible with earlier versions).<br />
** Improved font.<br />
** Fixed bug where graphic frame would be displayed at the same time as rendering text.<br />
* '''v3.1'''<br />
** Added chat API.<br />
* '''v3.0'''<br />
** Upgraded public release.<br />
** Rewrote everything, so old release notes are irrelevant.<br />
<br />
==API Documentation==<br />
For the legacy API, including the chat API, [[InfoCenter v3 Legacy API|see here]].<br />
<br />
The InfoCenter signs are controllable using an HTTP/JSON API. This can be used from LSL or from any software or server capable of forming JSON strings and sending HTTP requests.<br />
<br />
The API endpoint is [http://ntbigroup.com/gentek/infocenter/api_json.php].<br />
<br />
A sample JSON request is as follows:<br />
<br />
{<br />
"request": "set_text",<br />
"api_key": "1234567890123456",<br />
"frames": [<br />
{<br />
"text": "Hello World!",<br />
"color": "",<br />
"align": "center",<br />
"word_wrap": true,<br />
"ignore_length": true,<br />
"time": 3<br />
},<br />
{<br />
"lines": [<br />
{<br />
"text": "ABCDEFGHIJKLMNOP",<br />
"color": "ROAYGBPWROAYGBPW",<br />
"align": "left"<br />
},<br />
{<br />
"text": "^^^^^^^^^^^^^^^^",<br />
"align": "right"<br />
}<br />
],<br />
"ignore_length": true,<br />
"time": 3<br />
},<br />
{<br />
"graphic": "Stop",<br />
"time": 3<br />
}<br />
]<br />
}<br />
<br />
===Required Key/Values===<br />
The JSON request must be an object with the following key-value pairs:<br />
<br />
* '''request''': Must be "set_text".<br />
* '''api_key''': The API key of the display or group to set. Remember to keep your API key private, because there is no other authentication.<br />
* '''frames''': An array of objects, each object being a single frame.<br />
** Multiple frames can be sent in the same request, and they will cycle. The maximum number of frames is defined by the type of display being used. If the number of frames in the request exceeds the maximum, the server will return an error.<br />
<br />
===Frame Object===<br />
Each frame must have only one of these required key-value pairs:<br />
<br />
* '''text''': A string of text to display.<br />
* '''lines''': An array of objects, each object being a single line on the display. Allows more precision in where text is displayed.<br />
* '''graphic''': The name of a graphic supported by this display (see below).<br />
<br />
The key-value above used determines which type of frame it is, which determines which options are available.<br />
<br />
====Text Frame Type====<br />
A '''text''' frame type can have the following options:<br />
<br />
* '''text''': Required. A string of text to display.<br />
* '''color''': Optional. A color string (see below). If an empty string or not defined, "A" is used.<br />
** If the color string is shorter than the text string, the rest of the text uses the last color character.<br />
** If '''word_wrap''' is enabled, the entire frame will only be the color of the last color character due to technical limitations.<br />
* '''align''': Optional. Either "left", "center", or "right". Can also be "l", "c", or "r". If not defined, aligned to left.<br />
** If '''word_wrap''' is enabled, this will align each line. If it is disabled, this will only align the last line, because the lines before it (if any) will be the full width of the display.<br />
* '''word_wrap''': Optional. Must be true to enable (JSON_TRUE in LSL). If enabled, words are wrapped naturally. If disabled or not defined, text is "hard" wrapped to the full width of the display. It is a good idea to enable '''ignore_length''' to avoid errors if words wrap beyond the limits of the display.<br />
* '''ignore_length''': Optional. Must be true to enable (JSON_TRUE in LSL). If enabled, the server will not check the length of the text. If disabled or not defined, the server will return an error if the text exceeds the maximum the display can show.<br />
* '''time''': Optional. A length of time in seconds, between 1 and 3600, to display the frame. If not defined, the time will default to 5 seconds.<br />
** The server does not check the minimum time it would take to render the display, so very short frame times may produce unintended results.<br />
<br />
====Lines Frame Type====<br />
A '''lines''' frame type can have the following options:<br />
<br />
* '''lines''': Required. An array of objects, each object being a single line on the display. Allows more precision in where text is displayed. Each line can have the following options:<br />
** '''text''': Required. A string of text to display on the line.<br />
** '''color''': Optional. Optional. A color string (see below). If the color string is shorter than the text string, the rest of the text uses the last color character. If the '''color''' option is not defined or is empty, "A" is used. If an invalid character is used, it is replaced with "W".<br />
** '''align''': Optional. Either "left", "center", or "right". Can also be "l", "c", or "r". If not defined, aligned to left.<br />
* '''ignore_length''': Optional. Must be true to enable (JSON_TRUE in LSL). If enabled, the server will not check the length of the text on each line, nor will it check the number of lines included in the request. If disabled or not defined, the server will return an error if the text exceeds the maximum the display can show in either dimension.<br />
* '''time''': Optional. A length of time in seconds, between 1 and 3600, to display the frame. If not defined, the time will default to 5 seconds.<br />
** The server does not check the minimum time it would take to render the display, so very short frame times may produce unintended results.<br />
<br />
====Graphic Frame Type====<br />
A '''graphic''' frame type can have the following options:<br />
<br />
* '''graphic''': The name of a graphic supported by this display. This is case-insensitive, but must otherwise be an exact match to a supported graphic, or the server will return an error. The supported graphics are as follows:<br />
** ''InfoCenter Highway'': "Stop", "Hazard", "Do Not Enter"<br />
** ''InfoCenter Matrix'': "Stop", "Hazard", "Do Not Enter", "Detour Left", "Detour Right", "Lane Open Down", "Lane Open Up", "Lane Closed", "Lane Left Down", "Lane Right Down", "Lane Left Up", "Lane Right Up", "One Way Left", "One Way Right", "Yield", "Do Not Pass", "Stay In Lane", "No Trucks", "Trucks OK", "Speed Limit 5", "Speed Limit 10", "Speed Limit 15", "Speed Limit 20", "Speed Limit 25", "Speed Limit 30", "Speed Limit 35", "Speed Limit 40", "Speed Limit 45", "Speed Limit 50", "Speed Limit 55", "Speed Limit 60", "Speed Limit 65", "Speed Limit 70", "Speed Limit 75", "Speed Limit 80", "Keep Right", "Keep Left", "No Right Turn", "No Left/U Turn", "No Left Turn", "No U Turn", "Straight Or Left", "Straight Or Right", "Straight Only", "Left Turn Only", "Right Turn Only", "No Turns"<br />
** ''InfoCenter Notice'': "Information", "Today's Events", "Huge Sale", "Discounts", "Best Deals", "Notice", "Warning", "Danger"<br />
** ''InfoCenter Personal'': "Sale", "Come On In", "News Flash", "Happy 4th", "Welcome", "Open", "Closed", "Thank You", "No Smoking"<br />
** ''InfoCenter Mobile'': "Stop", "Hazard", "Do Not Enter", "Chase Right", "Chase Left", "Arrow Right", "Arrow Left", "Flash Right", "Flash Left", "Chevron Right", "Chevron Left", "Arrow Split", "Flash Split", "Flagger", "Stop Left", "Stop Right", "Detour Left", "Detour Right"<br />
* '''time''': Optional. A length of time in seconds, between 1 and 3600, to display the frame. If not defined, the time will default to 5 seconds.<br />
<br />
===HTTP Request Format===<br />
The required URL, as part of an LSL HTTP request, is as follows:<br />
<br />
llHTTPRequest("<nowiki>http://ntbigroup.com/gentek/infocenter/api_json.php</nowiki>", [HTTP_METHOD, "PUT"], json_request);<br />
<br />
This URL is also accessible from any web server.<br />
<br />
===HTTP Response Format===<br />
The server returns a JSON object with the following key-value pairs:<br />
<br />
* '''api''': Always "infocenter_json".<br />
* '''status''': Either "ok" or "error".<br />
* '''error''': An error number. Only included if '''status''' is "error". Include this number if possible when contacting support.<br />
* '''text''': A textual status response. If successful, will include how many displays succeeded and failed. If failed, will include a human-readable error message.<br />
<br />
===LSL Sample===<br />
A sample LSL script, implementing the JSON sample above, is below:<br />
<br />
key api_request;<br />
default<br />
{<br />
state_entry()<br />
{<br />
string json_request = llList2Json(JSON_OBJECT, [<br />
"request", "\"set_text\"",<br />
"api_key", "\"1234567890123456\"",<br />
"frames", llList2Json(JSON_ARRAY, [<br />
llList2Json(JSON_OBJECT, [<br />
"text", "\"Hello World!\"",<br />
"color", "",<br />
"align", "center",<br />
"word_wrap", JSON_TRUE,<br />
"ignore_length", JSON_TRUE,<br />
"time", 3<br />
]),<br />
llList2Json(JSON_OBJECT, [<br />
"lines", llList2Json(JSON_ARRAY, [<br />
llList2Json(JSON_OBJECT, [<br />
"text", "\"ABCDEFGHIJKLMNOP\"",<br />
"color", "\"ROAYGBPWROAYGBPW\"",<br />
"align", "left"<br />
]),<br />
llList2Json(JSON_OBJECT, [<br />
"text", "\"^^^^^^^^^^^^^^^^\"",<br />
"align", "r"<br />
])<br />
]),<br />
"ignore_length", JSON_TRUE,<br />
"time", 5<br />
]),<br />
llList2Json(JSON_OBJECT, [<br />
"graphic", "\"Stop\"",<br />
"time", 3<br />
])<br />
])<br />
]);<br />
api_request = llHTTPRequest("<nowiki>http://ntbigroup.com/gentek/infocenter/api_json.php</nowiki>", [HTTP_METHOD, "PUT"], json_request);<br />
}<br />
http_response(key request_id, integer status, list metadata, string body)<br />
{<br />
if (request_id == api_request)<br />
{<br />
api_request = NULL_KEY;<br />
if (status == 200) llOwnerSay("Response: " + body);<br />
else llOwnerSay("Server error. (" + (string)status + ")");<br />
}<br />
}<br />
}<br />
<br />
Note that LSL's JSON handling requires you to wrap values in escaped quotes, like so:<br />
<br />
["request", "\"set_text\""]<br />
<br />
You do not need to wrap keys in escaped quotes because the specification does not include any keys that could be interpreted as raw JSON.<br />
<br />
{{Gentek}}</div>NelsonJenkinshttps://wiki.ntbigroup.com/index.php?title=InfoCenter&diff=2917InfoCenter2020-03-14T20:44:19Z<p>NelsonJenkins: /* LSL Sample */</p>
<hr />
<div>{{ infobox product<br />
| title = InfoCenter<br />
| image = [[File:replaceme.jpg|200px|center]]<br />
| caption = InfoCenter Display Kit vendor image.<br />
| inventor = [[Nelson Jenkins]], [[SLI Komarov]]<br />
| launch year = 2008, upgraded in 2014<br />
| company = [[Gentek]]<br />
| available = Marketplace & In-World<br />
| url = '''[https://marketplace.secondlife.com/p/InfoCenter-Display-Kit-Four-Electronic-Text-Display-Sign-Models/6579929 InfoCenter Display Kit]'''<br>'''[https://marketplace.secondlife.com/p/InfoCenter-Mobile-Trailer-Mounted-Electronic-Text-Display-Sign/6579901 InfoCenter Mobile]'''<br />
}}<br />
<br />
The '''InfoCenter''' is a series of electronic text display signs (Personal, Notice, Highway, Matrix, and Mobile) sold by [[Gentek]]. They are designed for transportation & commercial purposes, although have been creatively used for a wide variety of applications. They are all web-controllable and include an API for scripters and web developers.<br />
<br />
This page covers the InfoCenter Series v3 and above. Because of the complexity in the new system and licensing restrictions, v3 is not a free update. For older versions, visit these pages: [[InfoCenter Mobile|Mobile]], [[InfoCenter Highway|Highway]], or [[InfoCenter Personal|Personal]]<br />
<br />
==Models==<br />
The InfoCenter is made up of two separate products - the InfoCenter Display Kit, and the InfoCenter Mobile.<br />
<br />
===InfoCenter Display Kit===<br />
The Display Kit includes the following models (in both standard and Duo variants, Duo typically doubling both the number of lines and characters per line, effectively quadrupling capacity):<br />
* '''InfoCenter Personal''' - 16 x 1 (2 LI) or 32 x 2 (5 LI) characters. Ideal for general commercial use, and includes a variety of animated graphics for stores.<br />
* '''InfoCenter Notice''' - 16 x 7 (8 LI) or 32 x 14 (29 LI) characters. The highest-capacity model, ideal for news & information. Also includes graphics for commercial & industrial purposes.<br />
* '''InfoCenter Highway''' - 16 x 3 (4 LI) or 32 x 6 (13 LI) characters. Best suited for overhead gantry installations on roads, but can be used for walkway or general commercial applications.<br />
* '''InfoCenter Matrix''' - 4 x 2 (1 LI) or 8 x 5 (3 LI) characters. A road sign display with many graphics for lane control, variable speed limits, hazard warning, detours, turn restrictions, and more.<br />
All models, excluding the Highway, have a toggleable mounting bracket. All models are modifiable (scripts excluded) and can be resized or linked (with the caveat that they cannot be linked together).<br />
<br />
===InfoCenter Mobile===<br />
The Mobile model is used for construction & road closures. 8 x 3 characters (3 LI) - the Mobile does not have a Duo variant. It is a trailer unit which can be rotated for the optimum viewing angle. It also has two trailer colors (grey & orange) and the display unit can be resized to three different sizes for different use cases. Unlike other models, the InfoCenter Mobile is not modifiable.<br />
<br />
Because of the Mobile's long-lasting popularity over other models, we sell it separately to reduce costs for those just interested in this model. Besides the features above, the Mobile is technically identical to all other models - it is web controllable and uses the same API.<br />
<br />
==Setup & Use==<br />
InfoCenter devices are ready for use out of the box. You can control some cosmetic options described above, but once they are rezzed, they can be set immediately.<br />
<br />
All InfoCenter devices are accessible through the [http://ntbigroup.com/gentek/infocenter/ InfoCenter Manager.] If you access the Manager directly, you will have to log in - you can avoid this by clicking a sign and selecting ''Web Control''. (This will also highlight the selected sign in the manager.)<br />
<br />
If you have not created an NTBI Group account before, you will be prompted to enter a password - do not use your SL password for this! Then, in the future, you can log in to the NTBI Group website (including the InfoCenter Manager) without even being in-world.<br />
<br />
===Setting a Message===<br />
You can set any of your InfoCenter devices from the InfoCenter Manager. Click the ''Set'' button, and you will be shown the message designer interface.<br />
<br />
Messages are made up of slides. Each slide can either be a text slide or a graphic slide, and can be set to display for generally any length of time you want. Slides are displayed sequentially and loop when completed.<br />
<br />
The grey number next to the model name for the device you are setting is the maximum number of slides - this is dependent on the capacity of the display, so smaller displays can handle more slides (up to 60). Some very high capacity devices (such as the Notice Duo) can only handle a few slides.<br />
<br />
When you open the message designer, the message currently displayed on that device will be shown, so you can edit it if you wish. By default, it is a single blank slide.<br />
<br />
* To add a text slide, type your message into the text cell input area. By default, the Amber color is used, but you can click any color in the palette below to select that color. Any new characters you type will then be in that color. When you're finished, click the ''Add Text'' button to add it to the slides.<br />
** Because of Javascript limitations, you must release each key before typing the next one, otherwise it won't register - type slowly and carefully!<br />
** Some characters are not permitted as text. If that is the case, they will not be entered.<br />
** For a full box character, like older InfoCenter models, use the ^ (caret) character. (This will not be shown on the website - it will only appear correctly in-world.)<br />
* To add a graphic slide, select a graphic from the dropdown. A preview will appear above it. To add the graphic, click ''Add Graphic''.<br />
* To move slides around or delete them, click the icons next to them. Keep in mind that by default, a blank slide is included as the first slide - you may want to remove it.<br />
* To change the time that a slide is shown, click ''Change'' and type in a new time (in seconds), then click ''Save''. Some high-capacity devices require longer slide times.<br />
<br />
When you're finished, click ''Send To This Device''. The message will be sent and displayed immediately in-world. For information on how the ''Send To Entire Group'' button works, read '''Using Groups''' below.<br />
<br />
===Using Templates===<br />
Templates are a way to easily save and recall messages. Say, for example, that you have 3 different messages you plan on displaying, but only one at a time, and you don't want to retype them every time. Templates allow you to save the message and load it later on that device (or any same-model device).<br />
<br />
* To save a template, design the message that you want to display, then type in a name above the ''Save As Template'' button, then click the button. If you already have a template with that name, it will be overwritten, so check first.<br />
* To load a template, click the dropdown to the right and select the template you want, then click ''Load''. To permanently delete a template, click ''Delete'' instead.<br />
<br />
===Using Groups===<br />
Groups are an easy way to control multiple devices at once. Devices can only belong to a single group at a time, but you can have multiple groups. Each group can only support one specific model.<br />
<br />
* To add a device to a group, click the ''Group'' button, then enter the name of the group you want to add it to. If the group doesn't exist, it will be created. If it does, the device will simply be added to the group.<br />
* To remove a device from a group, click the ''Group'' button, delete the text in the textbox, and then click ''OK''. This will remove it from the group. If the group no longer has any members, it will be hidden, but not technically deleted - if you recreate that group with the same name, the API key will be retained. (More information on this is in the API section.)<br />
* To rename a group, click the ''Rename'' button next to it, then enter a new group name. This will rename it without changing the API key, and all devices will remain in the group under the new name.<br />
* To set a message on an entire group, begin by setting a message on a single group member. When you're ready, click ''Send To Entire Group''. This will send the message to all group members.<br />
<br />
===Renaming & Deleting Devices===<br />
When your device is first rezzed, it will be named "Unnamed" followed by a number. Not only is this not descriptive, but it is a bit dangerous - if your display is reset for any reason, it will lose its old name and API key. To rename it, simply click the ''Rename'' button and enter a new name. You can also rename it from in-world using the ''Set Disp ID'' option.<br />
<br />
If your device disappears in-world, it will remain in the InfoCenter Manager. This is intended - it's to prevent accidentally deleting the device if the region is temporarily offline or there is a communication error. You can delete devices from the InfoCenter Manager by clicking ''Delete''. This will not delete it in-world - it will only disappear from the website and lose its API key. If you delete a display while it is still in-world and online, you will get a notification in-world.<br />
<br />
Sometimes, you may have several devices which no longer exist, but you don't want to delete them individually. To "flush" non-responsive devices, click the link at the very bottom of the page. This will individually check each device and, if it does not respond, it will be deleted automatically. Note that if a region is offline or very laggy, devices in it may be deleted without warning, so make sure all regions are OK before doing this.<br />
<br />
==Updates & Release Notes==<br />
You can update any InfoCenter product by rezzing it directly from your inventory (each one has an updater script which auto-deletes on first rez, so rezzing a used copy will not work).<br />
* '''v3.2'''<br />
** Added JSON API (backwards-compatible with earlier versions).<br />
** Improved font.<br />
** Fixed bug where graphic frame would be displayed at the same time as rendering text.<br />
* '''v3.1'''<br />
** Added chat API.<br />
* '''v3.0'''<br />
** Upgraded public release.<br />
** Rewrote everything, so old release notes are irrelevant.<br />
<br />
==API Documentation==<br />
For the legacy API, including the chat API, [[InfoCenter v3 Legacy API|see here]].<br />
<br />
The InfoCenter signs are controllable using an HTTP/JSON API. This can be used from LSL or from any software or server capable of forming JSON strings and sending HTTP requests.<br />
<br />
A sample JSON request is as follows:<br />
<br />
{<br />
"request": "set_text",<br />
"api_key": "1234567890123456",<br />
"frames": [<br />
{<br />
"text": "Hello World!",<br />
"color": "",<br />
"align": "center",<br />
"word_wrap": true,<br />
"ignore_length": true,<br />
"time": 3<br />
},<br />
{<br />
"lines": [<br />
{<br />
"text": "ABCDEFGHIJKLMNOP",<br />
"color": "ROAYGBPWROAYGBPW",<br />
"align": "left"<br />
},<br />
{<br />
"text": "^^^^^^^^^^^^^^^^",<br />
"align": "right"<br />
}<br />
],<br />
"ignore_length": true,<br />
"time": 3<br />
},<br />
{<br />
"graphic": "Stop",<br />
"time": 3<br />
}<br />
]<br />
}<br />
<br />
===Required Key/Values===<br />
The JSON request must be an object with the following key-value pairs:<br />
<br />
* '''request''': Must be "set_text".<br />
* '''api_key''': The API key of the display or group to set. Remember to keep your API key private, because there is no other authentication.<br />
* '''frames''': An array of objects, each object being a single frame.<br />
** Multiple frames can be sent in the same request, and they will cycle. The maximum number of frames is defined by the type of display being used. If the number of frames in the request exceeds the maximum, the server will return an error.<br />
<br />
===Frame Object===<br />
Each frame must have only one of these required key-value pairs:<br />
<br />
* '''text''': A string of text to display.<br />
* '''lines''': An array of objects, each object being a single line on the display. Allows more precision in where text is displayed.<br />
* '''graphic''': The name of a graphic supported by this display (see below).<br />
<br />
The key-value above used determines which type of frame it is, which determines which options are available.<br />
<br />
====Text Frame Type====<br />
A '''text''' frame type can have the following options:<br />
<br />
* '''text''': Required. A string of text to display.<br />
* '''color''': Optional. A color string (see below). If an empty string or not defined, "A" is used.<br />
** If the color string is shorter than the text string, the rest of the text uses the last color character.<br />
** If '''word_wrap''' is enabled, the entire frame will only be the color of the last color character due to technical limitations.<br />
* '''align''': Optional. Either "left", "center", or "right". Can also be "l", "c", or "r". If not defined, aligned to left.<br />
** If '''word_wrap''' is enabled, this will align each line. If it is disabled, this will only align the last line, because the lines before it (if any) will be the full width of the display.<br />
* '''word_wrap''': Optional. Must be true to enable (JSON_TRUE in LSL). If enabled, words are wrapped naturally. If disabled or not defined, text is "hard" wrapped to the full width of the display. It is a good idea to enable '''ignore_length''' to avoid errors if words wrap beyond the limits of the display.<br />
* '''ignore_length''': Optional. Must be true to enable (JSON_TRUE in LSL). If enabled, the server will not check the length of the text. If disabled or not defined, the server will return an error if the text exceeds the maximum the display can show.<br />
* '''time''': Optional. A length of time in seconds, between 1 and 3600, to display the frame. If not defined, the time will default to 5 seconds.<br />
** The server does not check the minimum time it would take to render the display, so very short frame times may produce unintended results.<br />
<br />
====Lines Frame Type====<br />
A '''lines''' frame type can have the following options:<br />
<br />
* '''lines''': Required. An array of objects, each object being a single line on the display. Allows more precision in where text is displayed. Each line can have the following options:<br />
** '''text''': Required. A string of text to display on the line.<br />
** '''color''': Optional. Optional. A color string (see below). If the color string is shorter than the text string, the rest of the text uses the last color character. If the '''color''' option is not defined or is empty, "A" is used. If an invalid character is used, it is replaced with "W".<br />
** '''align''': Optional. Either "left", "center", or "right". Can also be "l", "c", or "r". If not defined, aligned to left.<br />
* '''ignore_length''': Optional. Must be true to enable (JSON_TRUE in LSL). If enabled, the server will not check the length of the text on each line, nor will it check the number of lines included in the request. If disabled or not defined, the server will return an error if the text exceeds the maximum the display can show in either dimension.<br />
* '''time''': Optional. A length of time in seconds, between 1 and 3600, to display the frame. If not defined, the time will default to 5 seconds.<br />
** The server does not check the minimum time it would take to render the display, so very short frame times may produce unintended results.<br />
<br />
====Graphic Frame Type====<br />
A '''graphic''' frame type can have the following options:<br />
<br />
* '''graphic''': The name of a graphic supported by this display. This is case-insensitive, but must otherwise be an exact match to a supported graphic, or the server will return an error. The supported graphics are as follows:<br />
** ''InfoCenter Highway'': "Stop", "Hazard", "Do Not Enter"<br />
** ''InfoCenter Matrix'': "Stop", "Hazard", "Do Not Enter", "Detour Left", "Detour Right", "Lane Open Down", "Lane Open Up", "Lane Closed", "Lane Left Down", "Lane Right Down", "Lane Left Up", "Lane Right Up", "One Way Left", "One Way Right", "Yield", "Do Not Pass", "Stay In Lane", "No Trucks", "Trucks OK", "Speed Limit 5", "Speed Limit 10", "Speed Limit 15", "Speed Limit 20", "Speed Limit 25", "Speed Limit 30", "Speed Limit 35", "Speed Limit 40", "Speed Limit 45", "Speed Limit 50", "Speed Limit 55", "Speed Limit 60", "Speed Limit 65", "Speed Limit 70", "Speed Limit 75", "Speed Limit 80", "Keep Right", "Keep Left", "No Right Turn", "No Left/U Turn", "No Left Turn", "No U Turn", "Straight Or Left", "Straight Or Right", "Straight Only", "Left Turn Only", "Right Turn Only", "No Turns"<br />
** ''InfoCenter Notice'': "Information", "Today's Events", "Huge Sale", "Discounts", "Best Deals", "Notice", "Warning", "Danger"<br />
** ''InfoCenter Personal'': "Sale", "Come On In", "News Flash", "Happy 4th", "Welcome", "Open", "Closed", "Thank You", "No Smoking"<br />
** ''InfoCenter Mobile'': "Stop", "Hazard", "Do Not Enter", "Chase Right", "Chase Left", "Arrow Right", "Arrow Left", "Flash Right", "Flash Left", "Chevron Right", "Chevron Left", "Arrow Split", "Flash Split", "Flagger", "Stop Left", "Stop Right", "Detour Left", "Detour Right"<br />
* '''time''': Optional. A length of time in seconds, between 1 and 3600, to display the frame. If not defined, the time will default to 5 seconds.<br />
<br />
===HTTP Request Format===<br />
The required URL, as part of an LSL HTTP request, is as follows:<br />
<br />
llHTTPRequest("<nowiki>http://ntbigroup.com/gentek/infocenter/api_json.php</nowiki>", [HTTP_METHOD, "PUT"], json_request);<br />
<br />
This URL is also accessible from any web server.<br />
<br />
===HTTP Response Format===<br />
The server returns a JSON object with the following key-value pairs:<br />
<br />
* '''api''': Always "infocenter_json".<br />
* '''status''': Either "ok" or "error".<br />
* '''error''': An error number. Only included if '''status''' is "error". Include this number if possible when contacting support.<br />
* '''text''': A textual status response. If successful, will include how many displays succeeded and failed. If failed, will include a human-readable error message.<br />
<br />
===LSL Sample===<br />
A sample LSL script, implementing the JSON sample above, is below:<br />
<br />
key api_request;<br />
default<br />
{<br />
state_entry()<br />
{<br />
string json_request = llList2Json(JSON_OBJECT, [<br />
"request", "\"set_text\"",<br />
"api_key", "\"1234567890123456\"",<br />
"frames", llList2Json(JSON_ARRAY, [<br />
llList2Json(JSON_OBJECT, [<br />
"text", "\"Hello World!\"",<br />
"color", "",<br />
"align", "center",<br />
"word_wrap", JSON_TRUE,<br />
"ignore_length", JSON_TRUE,<br />
"time", 3<br />
]),<br />
llList2Json(JSON_OBJECT, [<br />
"lines", llList2Json(JSON_ARRAY, [<br />
llList2Json(JSON_OBJECT, [<br />
"text", "\"ABCDEFGHIJKLMNOP\"",<br />
"color", "\"ROAYGBPWROAYGBPW\"",<br />
"align", "left"<br />
]),<br />
llList2Json(JSON_OBJECT, [<br />
"text", "\"^^^^^^^^^^^^^^^^\"",<br />
"align", "r"<br />
])<br />
]),<br />
"ignore_length", JSON_TRUE,<br />
"time", 5<br />
]),<br />
llList2Json(JSON_OBJECT, [<br />
"graphic", "\"Stop\"",<br />
"time", 3<br />
])<br />
])<br />
]);<br />
api_request = llHTTPRequest("<nowiki>http://ntbigroup.com/gentek/infocenter/api_json.php</nowiki>", [HTTP_METHOD, "PUT"], json_request);<br />
}<br />
http_response(key request_id, integer status, list metadata, string body)<br />
{<br />
if (request_id == api_request)<br />
{<br />
api_request = NULL_KEY;<br />
if (status == 200) llOwnerSay("Response: " + body);<br />
else llOwnerSay("Server error. (" + (string)status + ")");<br />
}<br />
}<br />
}<br />
<br />
Note that LSL's JSON handling requires you to wrap values in escaped quotes, like so:<br />
<br />
["request", "\"set_text\""]<br />
<br />
You do not need to wrap keys in escaped quotes because the specification does not include any keys that could be interpreted as raw JSON.<br />
<br />
{{Gentek}}</div>NelsonJenkinshttps://wiki.ntbigroup.com/index.php?title=InfoCenter&diff=2916InfoCenter2020-03-14T20:44:03Z<p>NelsonJenkins: /* HTTP Request Format */</p>
<hr />
<div>{{ infobox product<br />
| title = InfoCenter<br />
| image = [[File:replaceme.jpg|200px|center]]<br />
| caption = InfoCenter Display Kit vendor image.<br />
| inventor = [[Nelson Jenkins]], [[SLI Komarov]]<br />
| launch year = 2008, upgraded in 2014<br />
| company = [[Gentek]]<br />
| available = Marketplace & In-World<br />
| url = '''[https://marketplace.secondlife.com/p/InfoCenter-Display-Kit-Four-Electronic-Text-Display-Sign-Models/6579929 InfoCenter Display Kit]'''<br>'''[https://marketplace.secondlife.com/p/InfoCenter-Mobile-Trailer-Mounted-Electronic-Text-Display-Sign/6579901 InfoCenter Mobile]'''<br />
}}<br />
<br />
The '''InfoCenter''' is a series of electronic text display signs (Personal, Notice, Highway, Matrix, and Mobile) sold by [[Gentek]]. They are designed for transportation & commercial purposes, although have been creatively used for a wide variety of applications. They are all web-controllable and include an API for scripters and web developers.<br />
<br />
This page covers the InfoCenter Series v3 and above. Because of the complexity in the new system and licensing restrictions, v3 is not a free update. For older versions, visit these pages: [[InfoCenter Mobile|Mobile]], [[InfoCenter Highway|Highway]], or [[InfoCenter Personal|Personal]]<br />
<br />
==Models==<br />
The InfoCenter is made up of two separate products - the InfoCenter Display Kit, and the InfoCenter Mobile.<br />
<br />
===InfoCenter Display Kit===<br />
The Display Kit includes the following models (in both standard and Duo variants, Duo typically doubling both the number of lines and characters per line, effectively quadrupling capacity):<br />
* '''InfoCenter Personal''' - 16 x 1 (2 LI) or 32 x 2 (5 LI) characters. Ideal for general commercial use, and includes a variety of animated graphics for stores.<br />
* '''InfoCenter Notice''' - 16 x 7 (8 LI) or 32 x 14 (29 LI) characters. The highest-capacity model, ideal for news & information. Also includes graphics for commercial & industrial purposes.<br />
* '''InfoCenter Highway''' - 16 x 3 (4 LI) or 32 x 6 (13 LI) characters. Best suited for overhead gantry installations on roads, but can be used for walkway or general commercial applications.<br />
* '''InfoCenter Matrix''' - 4 x 2 (1 LI) or 8 x 5 (3 LI) characters. A road sign display with many graphics for lane control, variable speed limits, hazard warning, detours, turn restrictions, and more.<br />
All models, excluding the Highway, have a toggleable mounting bracket. All models are modifiable (scripts excluded) and can be resized or linked (with the caveat that they cannot be linked together).<br />
<br />
===InfoCenter Mobile===<br />
The Mobile model is used for construction & road closures. 8 x 3 characters (3 LI) - the Mobile does not have a Duo variant. It is a trailer unit which can be rotated for the optimum viewing angle. It also has two trailer colors (grey & orange) and the display unit can be resized to three different sizes for different use cases. Unlike other models, the InfoCenter Mobile is not modifiable.<br />
<br />
Because of the Mobile's long-lasting popularity over other models, we sell it separately to reduce costs for those just interested in this model. Besides the features above, the Mobile is technically identical to all other models - it is web controllable and uses the same API.<br />
<br />
==Setup & Use==<br />
InfoCenter devices are ready for use out of the box. You can control some cosmetic options described above, but once they are rezzed, they can be set immediately.<br />
<br />
All InfoCenter devices are accessible through the [http://ntbigroup.com/gentek/infocenter/ InfoCenter Manager.] If you access the Manager directly, you will have to log in - you can avoid this by clicking a sign and selecting ''Web Control''. (This will also highlight the selected sign in the manager.)<br />
<br />
If you have not created an NTBI Group account before, you will be prompted to enter a password - do not use your SL password for this! Then, in the future, you can log in to the NTBI Group website (including the InfoCenter Manager) without even being in-world.<br />
<br />
===Setting a Message===<br />
You can set any of your InfoCenter devices from the InfoCenter Manager. Click the ''Set'' button, and you will be shown the message designer interface.<br />
<br />
Messages are made up of slides. Each slide can either be a text slide or a graphic slide, and can be set to display for generally any length of time you want. Slides are displayed sequentially and loop when completed.<br />
<br />
The grey number next to the model name for the device you are setting is the maximum number of slides - this is dependent on the capacity of the display, so smaller displays can handle more slides (up to 60). Some very high capacity devices (such as the Notice Duo) can only handle a few slides.<br />
<br />
When you open the message designer, the message currently displayed on that device will be shown, so you can edit it if you wish. By default, it is a single blank slide.<br />
<br />
* To add a text slide, type your message into the text cell input area. By default, the Amber color is used, but you can click any color in the palette below to select that color. Any new characters you type will then be in that color. When you're finished, click the ''Add Text'' button to add it to the slides.<br />
** Because of Javascript limitations, you must release each key before typing the next one, otherwise it won't register - type slowly and carefully!<br />
** Some characters are not permitted as text. If that is the case, they will not be entered.<br />
** For a full box character, like older InfoCenter models, use the ^ (caret) character. (This will not be shown on the website - it will only appear correctly in-world.)<br />
* To add a graphic slide, select a graphic from the dropdown. A preview will appear above it. To add the graphic, click ''Add Graphic''.<br />
* To move slides around or delete them, click the icons next to them. Keep in mind that by default, a blank slide is included as the first slide - you may want to remove it.<br />
* To change the time that a slide is shown, click ''Change'' and type in a new time (in seconds), then click ''Save''. Some high-capacity devices require longer slide times.<br />
<br />
When you're finished, click ''Send To This Device''. The message will be sent and displayed immediately in-world. For information on how the ''Send To Entire Group'' button works, read '''Using Groups''' below.<br />
<br />
===Using Templates===<br />
Templates are a way to easily save and recall messages. Say, for example, that you have 3 different messages you plan on displaying, but only one at a time, and you don't want to retype them every time. Templates allow you to save the message and load it later on that device (or any same-model device).<br />
<br />
* To save a template, design the message that you want to display, then type in a name above the ''Save As Template'' button, then click the button. If you already have a template with that name, it will be overwritten, so check first.<br />
* To load a template, click the dropdown to the right and select the template you want, then click ''Load''. To permanently delete a template, click ''Delete'' instead.<br />
<br />
===Using Groups===<br />
Groups are an easy way to control multiple devices at once. Devices can only belong to a single group at a time, but you can have multiple groups. Each group can only support one specific model.<br />
<br />
* To add a device to a group, click the ''Group'' button, then enter the name of the group you want to add it to. If the group doesn't exist, it will be created. If it does, the device will simply be added to the group.<br />
* To remove a device from a group, click the ''Group'' button, delete the text in the textbox, and then click ''OK''. This will remove it from the group. If the group no longer has any members, it will be hidden, but not technically deleted - if you recreate that group with the same name, the API key will be retained. (More information on this is in the API section.)<br />
* To rename a group, click the ''Rename'' button next to it, then enter a new group name. This will rename it without changing the API key, and all devices will remain in the group under the new name.<br />
* To set a message on an entire group, begin by setting a message on a single group member. When you're ready, click ''Send To Entire Group''. This will send the message to all group members.<br />
<br />
===Renaming & Deleting Devices===<br />
When your device is first rezzed, it will be named "Unnamed" followed by a number. Not only is this not descriptive, but it is a bit dangerous - if your display is reset for any reason, it will lose its old name and API key. To rename it, simply click the ''Rename'' button and enter a new name. You can also rename it from in-world using the ''Set Disp ID'' option.<br />
<br />
If your device disappears in-world, it will remain in the InfoCenter Manager. This is intended - it's to prevent accidentally deleting the device if the region is temporarily offline or there is a communication error. You can delete devices from the InfoCenter Manager by clicking ''Delete''. This will not delete it in-world - it will only disappear from the website and lose its API key. If you delete a display while it is still in-world and online, you will get a notification in-world.<br />
<br />
Sometimes, you may have several devices which no longer exist, but you don't want to delete them individually. To "flush" non-responsive devices, click the link at the very bottom of the page. This will individually check each device and, if it does not respond, it will be deleted automatically. Note that if a region is offline or very laggy, devices in it may be deleted without warning, so make sure all regions are OK before doing this.<br />
<br />
==Updates & Release Notes==<br />
You can update any InfoCenter product by rezzing it directly from your inventory (each one has an updater script which auto-deletes on first rez, so rezzing a used copy will not work).<br />
* '''v3.2'''<br />
** Added JSON API (backwards-compatible with earlier versions).<br />
** Improved font.<br />
** Fixed bug where graphic frame would be displayed at the same time as rendering text.<br />
* '''v3.1'''<br />
** Added chat API.<br />
* '''v3.0'''<br />
** Upgraded public release.<br />
** Rewrote everything, so old release notes are irrelevant.<br />
<br />
==API Documentation==<br />
For the legacy API, including the chat API, [[InfoCenter v3 Legacy API|see here]].<br />
<br />
The InfoCenter signs are controllable using an HTTP/JSON API. This can be used from LSL or from any software or server capable of forming JSON strings and sending HTTP requests.<br />
<br />
A sample JSON request is as follows:<br />
<br />
{<br />
"request": "set_text",<br />
"api_key": "1234567890123456",<br />
"frames": [<br />
{<br />
"text": "Hello World!",<br />
"color": "",<br />
"align": "center",<br />
"word_wrap": true,<br />
"ignore_length": true,<br />
"time": 3<br />
},<br />
{<br />
"lines": [<br />
{<br />
"text": "ABCDEFGHIJKLMNOP",<br />
"color": "ROAYGBPWROAYGBPW",<br />
"align": "left"<br />
},<br />
{<br />
"text": "^^^^^^^^^^^^^^^^",<br />
"align": "right"<br />
}<br />
],<br />
"ignore_length": true,<br />
"time": 3<br />
},<br />
{<br />
"graphic": "Stop",<br />
"time": 3<br />
}<br />
]<br />
}<br />
<br />
===Required Key/Values===<br />
The JSON request must be an object with the following key-value pairs:<br />
<br />
* '''request''': Must be "set_text".<br />
* '''api_key''': The API key of the display or group to set. Remember to keep your API key private, because there is no other authentication.<br />
* '''frames''': An array of objects, each object being a single frame.<br />
** Multiple frames can be sent in the same request, and they will cycle. The maximum number of frames is defined by the type of display being used. If the number of frames in the request exceeds the maximum, the server will return an error.<br />
<br />
===Frame Object===<br />
Each frame must have only one of these required key-value pairs:<br />
<br />
* '''text''': A string of text to display.<br />
* '''lines''': An array of objects, each object being a single line on the display. Allows more precision in where text is displayed.<br />
* '''graphic''': The name of a graphic supported by this display (see below).<br />
<br />
The key-value above used determines which type of frame it is, which determines which options are available.<br />
<br />
====Text Frame Type====<br />
A '''text''' frame type can have the following options:<br />
<br />
* '''text''': Required. A string of text to display.<br />
* '''color''': Optional. A color string (see below). If an empty string or not defined, "A" is used.<br />
** If the color string is shorter than the text string, the rest of the text uses the last color character.<br />
** If '''word_wrap''' is enabled, the entire frame will only be the color of the last color character due to technical limitations.<br />
* '''align''': Optional. Either "left", "center", or "right". Can also be "l", "c", or "r". If not defined, aligned to left.<br />
** If '''word_wrap''' is enabled, this will align each line. If it is disabled, this will only align the last line, because the lines before it (if any) will be the full width of the display.<br />
* '''word_wrap''': Optional. Must be true to enable (JSON_TRUE in LSL). If enabled, words are wrapped naturally. If disabled or not defined, text is "hard" wrapped to the full width of the display. It is a good idea to enable '''ignore_length''' to avoid errors if words wrap beyond the limits of the display.<br />
* '''ignore_length''': Optional. Must be true to enable (JSON_TRUE in LSL). If enabled, the server will not check the length of the text. If disabled or not defined, the server will return an error if the text exceeds the maximum the display can show.<br />
* '''time''': Optional. A length of time in seconds, between 1 and 3600, to display the frame. If not defined, the time will default to 5 seconds.<br />
** The server does not check the minimum time it would take to render the display, so very short frame times may produce unintended results.<br />
<br />
====Lines Frame Type====<br />
A '''lines''' frame type can have the following options:<br />
<br />
* '''lines''': Required. An array of objects, each object being a single line on the display. Allows more precision in where text is displayed. Each line can have the following options:<br />
** '''text''': Required. A string of text to display on the line.<br />
** '''color''': Optional. Optional. A color string (see below). If the color string is shorter than the text string, the rest of the text uses the last color character. If the '''color''' option is not defined or is empty, "A" is used. If an invalid character is used, it is replaced with "W".<br />
** '''align''': Optional. Either "left", "center", or "right". Can also be "l", "c", or "r". If not defined, aligned to left.<br />
* '''ignore_length''': Optional. Must be true to enable (JSON_TRUE in LSL). If enabled, the server will not check the length of the text on each line, nor will it check the number of lines included in the request. If disabled or not defined, the server will return an error if the text exceeds the maximum the display can show in either dimension.<br />
* '''time''': Optional. A length of time in seconds, between 1 and 3600, to display the frame. If not defined, the time will default to 5 seconds.<br />
** The server does not check the minimum time it would take to render the display, so very short frame times may produce unintended results.<br />
<br />
====Graphic Frame Type====<br />
A '''graphic''' frame type can have the following options:<br />
<br />
* '''graphic''': The name of a graphic supported by this display. This is case-insensitive, but must otherwise be an exact match to a supported graphic, or the server will return an error. The supported graphics are as follows:<br />
** ''InfoCenter Highway'': "Stop", "Hazard", "Do Not Enter"<br />
** ''InfoCenter Matrix'': "Stop", "Hazard", "Do Not Enter", "Detour Left", "Detour Right", "Lane Open Down", "Lane Open Up", "Lane Closed", "Lane Left Down", "Lane Right Down", "Lane Left Up", "Lane Right Up", "One Way Left", "One Way Right", "Yield", "Do Not Pass", "Stay In Lane", "No Trucks", "Trucks OK", "Speed Limit 5", "Speed Limit 10", "Speed Limit 15", "Speed Limit 20", "Speed Limit 25", "Speed Limit 30", "Speed Limit 35", "Speed Limit 40", "Speed Limit 45", "Speed Limit 50", "Speed Limit 55", "Speed Limit 60", "Speed Limit 65", "Speed Limit 70", "Speed Limit 75", "Speed Limit 80", "Keep Right", "Keep Left", "No Right Turn", "No Left/U Turn", "No Left Turn", "No U Turn", "Straight Or Left", "Straight Or Right", "Straight Only", "Left Turn Only", "Right Turn Only", "No Turns"<br />
** ''InfoCenter Notice'': "Information", "Today's Events", "Huge Sale", "Discounts", "Best Deals", "Notice", "Warning", "Danger"<br />
** ''InfoCenter Personal'': "Sale", "Come On In", "News Flash", "Happy 4th", "Welcome", "Open", "Closed", "Thank You", "No Smoking"<br />
** ''InfoCenter Mobile'': "Stop", "Hazard", "Do Not Enter", "Chase Right", "Chase Left", "Arrow Right", "Arrow Left", "Flash Right", "Flash Left", "Chevron Right", "Chevron Left", "Arrow Split", "Flash Split", "Flagger", "Stop Left", "Stop Right", "Detour Left", "Detour Right"<br />
* '''time''': Optional. A length of time in seconds, between 1 and 3600, to display the frame. If not defined, the time will default to 5 seconds.<br />
<br />
===HTTP Request Format===<br />
The required URL, as part of an LSL HTTP request, is as follows:<br />
<br />
llHTTPRequest("<nowiki>http://ntbigroup.com/gentek/infocenter/api_json.php</nowiki>", [HTTP_METHOD, "PUT"], json_request);<br />
<br />
This URL is also accessible from any web server.<br />
<br />
===HTTP Response Format===<br />
The server returns a JSON object with the following key-value pairs:<br />
<br />
* '''api''': Always "infocenter_json".<br />
* '''status''': Either "ok" or "error".<br />
* '''error''': An error number. Only included if '''status''' is "error". Include this number if possible when contacting support.<br />
* '''text''': A textual status response. If successful, will include how many displays succeeded and failed. If failed, will include a human-readable error message.<br />
<br />
===LSL Sample===<br />
A sample LSL script, implementing the JSON sample above, is below:<br />
<br />
key api_request;<br />
default<br />
{<br />
state_entry()<br />
{<br />
string json_request = llList2Json(JSON_OBJECT, [<br />
"request", "\"set_text\"",<br />
"api_key", "\"1234567890123456\"",<br />
"frames", llList2Json(JSON_ARRAY, [<br />
llList2Json(JSON_OBJECT, [<br />
"text", "\"Hello World!\"",<br />
"color", "",<br />
"align", "center",<br />
"word_wrap", JSON_TRUE,<br />
"ignore_length", JSON_TRUE,<br />
"time", 3<br />
]),<br />
llList2Json(JSON_OBJECT, [<br />
"lines", llList2Json(JSON_ARRAY, [<br />
llList2Json(JSON_OBJECT, [<br />
"text", "\"ABCDEFGHIJKLMNOP\"",<br />
"color", "\"ROAYGBPWROAYGBPW\"",<br />
"align", "left"<br />
]),<br />
llList2Json(JSON_OBJECT, [<br />
"text", "\"^^^^^^^^^^^^^^^^\"",<br />
"align", "r"<br />
])<br />
]),<br />
"ignore_length", JSON_TRUE,<br />
"time", 5<br />
]),<br />
llList2Json(JSON_OBJECT, [<br />
"graphic", "\"Stop\"",<br />
"time", 3<br />
])<br />
])<br />
]);<br />
api_request = llHTTPRequest("http://ntbigroup.com/gentek/infocenter/api_json.php", [HTTP_METHOD, "PUT"], json_request);<br />
}<br />
http_response(key request_id, integer status, list metadata, string body)<br />
{<br />
if (request_id == api_request)<br />
{<br />
api_request = NULL_KEY;<br />
if (status == 200) llOwnerSay("Response: " + body);<br />
else llOwnerSay("Server error. (" + (string)status + ")");<br />
}<br />
}<br />
}<br />
<br />
Note that LSL's JSON handling requires you to wrap values in escaped quotes, like so:<br />
<br />
["request", "\"set_text\""]<br />
<br />
You do not need to wrap keys in escaped quotes because the specification does not include any keys that could be interpreted as raw JSON.<br />
<br />
{{Gentek}}</div>NelsonJenkinshttps://wiki.ntbigroup.com/index.php?title=InfoCenter_v3_Legacy_API&diff=2915InfoCenter v3 Legacy API2020-03-14T20:42:33Z<p>NelsonJenkins: </p>
<hr />
<div>The '''InfoCenter''' is a series of electronic text display signs (Personal, Notice, Highway, Matrix, and Mobile) sold by [[Gentek]]. This page covers the legacy API for the InfoCenter Series v3 and above. For the JSON API, which is highly recommended, [[InfoCenter|see here]].<br />
<br />
==API Documentation==<br />
The InfoCenter API allows you to control any sign from anywhere in-world or from any web server. You can set messages, change groups, rename things, and query for information. All you need is the API key for the display or group you want to control - you can even use API keys for displays you do not own.<br />
<br />
Keep your API keys private! If anyone else gets a copy of your API key, they can control your device without you knowing. If this happens, you can reset your API key by clicking the ''Refresh'' link next to it - but you can't set your own API key, and any scripts that use the old key will no longer work.<br />
<br />
Unlike the InfoCenter API from v2, the v3 API is HTTP-based - the API can send entire messages, not just single frames, and they will be cycled locally on the device. Additionally, messages sent through the API are visible from the InfoCenter Manager, and can be edited manually. The object that sends the HTTP request can be anywhere in-world. If you prefer the chat-based API, scroll to the bottom of the page.<br />
<br />
Invalid request types and internal errors will return <code>ERROR</code>. Although it is recommended to capture the request key and handle a response accordingly, it is not absolutely required. More information on LSL's <code>http_response</code> event is [http://wiki.secondlife.com/wiki/Http_response here.]<br />
<br />
===Setting a Message===<br />
You can set a message using the <code>set</code> request:<br />
<br />
llHTTPRequest("<nowiki>http://ntbigroup.com/gentek/infocenter/api.php?r=set&k=apikey</nowiki>",[HTTP_METHOD,"PUT"],"content");<br />
<br />
Replace ''apikey'' with the API key for the device or group you want to use, and replace ''content'' as described below. (This command will work for both devices and groups interchangeably.)<br />
<br />
This request can return the following in the <code>http_response</code> event:<br />
<br />
* <code>OK</code> - the message was sent to all devices succesfully<br />
* <code>GROUPFAIL</code> - the message was sent to some devices in the group, but some (not all) did not respond<br />
* <code>FAIL</code> - the message was not sent to any devices because none responded<br />
* <code>FORMAT-SEPARATOR</code> - your content string is not separated by <code>#$</code><br />
* <code>FORMAT-SLIDES</code> - your slide data and slide time lists are not the same length, or you sent more slides than the selected device/group can handle<br />
* <code>FORMAT-DATA</code> - one of your slide data strings is not the correct length<br />
* <code>FORMAT-TIME</code> - one of your slide times are not valid (<1 or >3600 seconds)<br />
** '''IMPORTANT:''' The API does not enforce the minimum slide times for high-capacity devices. If your slides are too fast, you may encounter problems.<br />
* <code>NOTFOUND</code> - the API key you used was not found<br />
<br />
====Content Format====<br />
The ''content'' for a set request must be of a very specific format. InfoCenter messages are composed like this:<br />
<br />
HELOWRLDWWWWWWWW|HOW R U?GGGGGGGG|GRAPHIC_Blank#$3|5|3<br />
<br />
There are two sections separated by <code>#$</code>. The first section is the slide data, the second section is the slide times. Slides are individually separated by <code>|</code> characters. They must be padded to fit on the display they are set on. Each slide time is in whole seconds (integers, not floats). Each slide data is composed like so:<br />
<br />
HOW R U?GGGGGGGG<br />
<br />
This is a single slide for a 8-character display. It is made up of the text and color strings concatenated together, each of which must be padded to <code>columns * rows</code> characters. So this could be an 8 x 1 display, or perhaps a 4 x 2 display.<br />
<br />
All InfoCenter devices support the same colors, each with a single-digit color code - '''R'''ed, '''O'''range, '''A'''mber, '''Y'''ellow, '''G'''reen, '''B'''lue, '''P'''urple, and '''W'''hite. Any characters used for color other than these will be interpreted as white. So, if you wanted to make a rainbow-colored line, you could do this:<br />
<br />
^^^^^^^^ROAYGBPW<br />
<br />
Remember that these strings are concatenated separately, not line-by-line. So, for an 8 x 3 display, it would look like this:<br />
<br />
^^^^^^^^^^^^^^^^^^^^^^^^ROAYGBPWROAYGBPWROAYGBPW<br />
<br />
====Alignment & Padding====<br />
For multiple-line displays, pad out each line individually, as the text will hard wrap. For example, on an 8 x 3 display:<br />
<br />
LEFT ALIGNED TEXT WWWWWWWWWWWWWWWWWWWWWWWW<br />
<br />
I AM CENTERED TEXT RRRRRRRRRRRRRRRRRRRRRRRR<br />
<br />
RIGHT ALIGNED TEXTAAAAAAAAAAAAAAAAAAAAAAAA<br />
<br />
Below is an LSL function for aligning each line:<br />
<br />
string align(string in, string dir, integer length, string pad)<br />
{<br />
if (pad == "") pad = " ";<br />
if (llToUpper(dir) == "L")<br />
{<br />
while (llStringLength(in) < length)<br />
{<br />
in = in + pad;<br />
}<br />
}<br />
else if (llToUpper(dir) == "R")<br />
{<br />
while (llStringLength(in) < length)<br />
{<br />
in = pad + in;<br />
}<br />
}<br />
else // assume center<br />
{<br />
integer osc = 0; // we have to be a little smarter here<br />
while (llStringLength(in) < length)<br />
{<br />
if (osc) in = pad + in; // this will align left, then right,<br />
else in = in + pad; // then left, then right...<br />
osc = !osc; // ... effectively centering the text<br />
}<br />
}<br />
return llGetSubString(in, 0, length - 1); // cut off any excess if we added it on accident<br />
}<br />
<br />
This function allows you to align text left, right, or centered, to a specific length (in our case, <code>columns</code>), using an optional customizable padding string. You can use this padding string for colors.<br />
<br />
For example, here's how to get the same text as above using this function (remember, we are on an 8 x 3 display):<br />
<br />
<code>align("LEFT", "L", 8, "") + align("ALIGNED", "L", 8, "") + align("TEXT", "L", 8, "") + align("", "", 24, "W")</code> - we can leave the padding string empty and it will default to a space<br />
<br />
<code>align("I AM", "", 8, "") + align("CENTERED", "", 8, "") + align("TEXT", "", 8, "") + align("", "", 24, "R")</code> - we can leave the alignment string empty and it will default to centered<br />
<br />
<code>align("RIGHT", "R", 8, "") + align("ALIGNED", "R", 8, "") + align("TEXT", "R", 8, "") + align("", "", 24, "A")</code><br />
<br />
Note the trick to create the color strings - by leaving the input and alignment strings empty, the function will simply create a string duplicating the padding string until it reaches the length. In our case, we used it to fill the entire display (8 x 3) with a single color. You could also make each line a separate color, or create a rainbow effect, like so:<br />
<br />
<code>align("", "", 24, "^") + align("", "", 8, "R") + align("", "", 8, "G") + align("", "", 8, "B")</code> - would make a red, green, and blue line<br />
<br />
<code>align("", "", 24, "^") + align("", "", 24, "ROAYGBPW")</code> - would make rainbow stripes (note that using any length of padding is fine, because any excess will be cut off)<br />
<br />
Slides must be of the correct length for the device they are set on, or they will be rejected by the API. Remember, the formula is <code>columns * rows</code> for the text and color strings - so <code>columns * rows * 2</code> for both of them combined together.<br />
<br />
====Graphic Slides====<br />
You can set graphic slides by simply taking the name of the graphic you want and adding <code>GRAPHIC_</code> to the beginning - for example, <code>GRAPHIC_Lane Open Down</code> for the Matrix. (If the graphic isn't supported by the model you are working with, it will show up as Blank.) Because graphics aren't colorable, you don't need to worry about color strings for them.<br />
<br />
====Example====<br />
Once you have your desired slides and times, you can do something like this to "finalize" them into the required format:<br />
<br />
string makeContent(list slide_data, list slide_times)<br />
{<br />
return llDumpList2String(slide_data, "|") + "#$" + llDumpList2String(slide_times, "|");<br />
}<br />
<br />
Note that the slide_data and slide_times lists must be of equal length.<br />
<br />
So, using the above functions (which are omitted for brevity), here's how to make (and send) a 3-slide centered message - replace ''apikey'' first. The entire script is included, and is extremely basic, but demonstrates how to also capture the response:<br />
<br />
'''REMEMBER: The following example uses the 8x3 display from the InfoCenter Mobile. If you are going to use the API for any other size, you will need to modify the number of characters in each slide.'''<br />
<br />
key api_request;<br />
<br />
default<br />
{<br />
state_entry()<br />
{<br />
api_request = llHTTPRequest("<nowiki>http://ntbigroup.com/gentek/infocenter/api.php?r=set&k=apikey</nowiki>", [HTTP_METHOD, "PUT"],<br />
makeContent([<br />
align("I AM", "", 8, "") + align("CENTERED", "", 8, "") + align("TEXT", "", 8, "") + align("", "", 8 * 3, "W") ,<br />
align("I AM", "", 8, "") + align("CENTERED", "", 8, "") + align("RED TEXT", "", 8, "") + align("", "", 8 * 3, "R") ,<br />
align("LOOK AT", "", 8, "") + align("THESE", "", 8, "") + align("COLORS", "", 8, "") + align("", "", 8 * 3, "ROAYGBPW")<br />
], [3, 3, 5])<br />
);<br />
}<br />
http_response(key request_id, integer status, list metadata, string body)<br />
{<br />
if (request_id == api_request)<br />
{<br />
api_request = NULL_KEY;<br />
if (status == 200) llOwnerSay("Response: " + body);<br />
else llOwnerSay("Server error. (" + (string)status + ")");<br />
}<br />
}<br />
}<br />
<br />
===Setting a Device's Group===<br />
You can set a device's group using the <code>grp</code> request:<br />
<br />
llHTTPRequest("<nowiki>http://ntbigroup.com/gentek/infocenter/api.php?r=grp&k=apikey</nowiki>", [HTTP_METHOD, "PUT"], "New Group Name");<br />
<br />
Replace ''apikey'' with the API key for the device you want to modify, and replace ''New Group Name'' with the group name that you want to add it to. To remove from a group, leave blank or enter ''NULL''.<br />
<br />
This request can return the following in the <code>http_response</code> event:<br />
<br />
* <code>OKNew Group Name</code> - the group was set successfully (the new group name is appended to <code>OK</code> - for example, when removing from a group, this will be <code>OKNULL</code>)<br />
* <code>LENGTH</code> - your group name is too long (maximum 64 characters)<br />
* <code>MISMATCH</code> - the group you want to join already exists and is for a different model<br />
* <code>NOTFOUND</code> - the API key you used was not found<br />
<br />
Remember, groups are never technically erased, so if adding to a group that previously existed but is currently empty, the group will be "recreated" using the old API key. This makes it possible to add devices to an empty group while knowing its API key in advance. However, it is not possible to get the group's API key through the API itself.<br />
<br />
===Renaming a Device or Group===<br />
You can rename a device or a group using the <code>ren</code> request:<br />
<br />
llHTTPRequest("<nowiki>http://ntbigroup.com/gentek/infocenter/api.php?r=ren&k=apikey</nowiki>", [HTTP_METHOD, "PUT"], "New Name");<br />
<br />
Replace ''apikey'' with the API key for the device or group you want to rename, and replace ''New Name'' with the new name you want to use. (This command will work for both devices and groups interchangeably.)<br />
<br />
This request can return the following in the <code>http_response</code> event:<br />
<br />
* <code>OKNew Name</code> - the name was set successfully (the new name is appended to <code>OK</code>)<br />
* <code>LENGTH</code> - your name is too short or too long (1-64 characters required)<br />
* <code>DUPLICATE</code> - the name you want to use already exists, or the device/group is already set to that name<br />
* <code>NOTFOUND</code> - the API key you used was not found<br />
<br />
Note that it is possible to remove all devices from a group by renaming the group to ''NULL''. However, this will make it impossible to use the group's API key again until a device is added to it.<br />
<br />
===Querying Device/Group Information===<br />
You can request information about a device or a group using the <code>inf</code> request:<br />
<br />
llHTTPRequest("<nowiki>http://ntbigroup.com/gentek/infocenter/api.php?r=inf&k=apikey</nowiki>", [HTTP_METHOD, "PUT"], "");<br />
<br />
Replace ''apikey'' with the API key for the device or group you want to get information about. The content field is not used. (This command will work for both devices and groups interchangeably.)<br />
<br />
This request can return the following in the <code>http_response</code> event:<br />
<br />
* For devices, a <code>#$</code>-separated string with the following: OK, DEVICE, device name/ID, device owner's username, device group, device model, device columns, device rows, max supported slides, location, UUID<br />
** For example: <code>OK#$DEVICE#$Unnamed 1#$nelson.jenkins#$NULL#$InfoCenter Mobile#$8#$3#$42#$Prototype (142, 228, 43)#$9794a972-0131-3f33-7059-b04fc5ad92dd</code><br />
* For groups, a <code>#$</code>-separated string with the following: OK, GROUP, group name, group owner's username, device model, device columns, device rows, max supported slides, number of devices in group<br />
** For example: <code>OK#$GROUP#$Test Group#$nelson.jenkins#$InfoCenter Personal#$16#$1#$60#$2</code><br />
* <code>NOTFOUND</code> - the API key you used was not found<br />
<br />
Use [http://wiki.secondlife.com/wiki/LlParseStringKeepNulls llParseStringKeepNulls] to split the response up. Also, do not rely on the return data to contain the same number of values forever; more may be added.<br />
<br />
===Chat API===<br />
Starting in v3.1, all InfoCenter displays support a basic chat API to set the display only. If you are experimenting with the API, it is strongly recommended that you start with the web-based API to ensure your requests are properly formatted, then switch to the chat API.<br />
<br />
The chat API mode is different in the following ways:<br />
<br />
* The chat API '''does not validate any data you send'''. The input sent to the chat API is processed immediately without regard for formatting mistakes. This can cause some odd behavior.<br />
* The chat API can only accept 1024 characters per request, which can limit the data you can send per request. However, all InfoCenter displays can support at least one frame within 1024 characters.<br />
* The chat API can only set the text on the display (a "set" request). It cannot set the display's group, rename it, or query it for information.<br />
* Text sent to the display through the chat API will not update the saved text shown when accessing the display through the website editor.<br />
* The chat API cannot set a display by its API key. To set a single display, you must use the display's UUID and use llRegionSayTo.<br />
* The chat API can only set a single display at once using llRegionSayTo. It cannot send a message to an entire group. While you can set multiple displays through llWhisper, llSay, llShout, and llRegionSay, you cannot do so if you have different sizes of displays in range, as that will cause issues.<br />
* The chat API will only work in the same region for displays owned by the same owner.<br />
* The chat API is somewhat faster than the web API and can handle setting multiple devices at once or in sequence very quickly. Each display can also queue up to 64 requests and will process them in order.<br />
<br />
The format for the chat API is the same as the web API's "set" request. However, the request is sent over channel -495310229, like so:<br />
<br />
default<br />
{<br />
state_entry()<br />
{<br />
llRegionSayTo("displayuuid", -495310229,<br />
makeContent([<br />
align("I AM", "", 8, "") + align("CENTERED", "", 8, "") + align("TEXT", "", 8, "") + align("", "", 8 * 3, "W") ,<br />
align("I AM", "", 8, "") + align("CENTERED", "", 8, "") + align("RED TEXT", "", 8, "") + align("", "", 8 * 3, "R") ,<br />
align("LOOK AT", "", 8, "") + align("THESE", "", 8, "") + align("COLORS", "", 8, "") + align("", "", 8 * 3, "ROAYGBPW")<br />
], [3, 3, 5])<br />
);<br />
}<br />
}<br />
<br />
{{Gentek}}</div>NelsonJenkinshttps://wiki.ntbigroup.com/index.php?title=InfoCenter_v3_Legacy_API&diff=2914InfoCenter v3 Legacy API2020-03-14T20:41:46Z<p>NelsonJenkins: </p>
<hr />
<div>The '''InfoCenter''' is a series of electronic text display signs (Personal, Notice, Highway, Matrix, and Mobile) sold by [[Gentek]]. This page covers the legacy API for the InfoCenter Series v3 and above. For the JSON API, which is highly recommended, [[InfoCenter|see here]].<br />
<br />
==API Documentation==<br />
The InfoCenter API allows you to control any sign from anywhere in-world or from any web server. You can set messages, change groups, rename things, and query for information. All you need is the API key for the display or group you want to control - you can even use API keys for displays you do not own.<br />
<br />
Keep your API keys private! If anyone else gets a copy of your API key, they can control your device without you knowing. If this happens, you can reset your API key by clicking the ''Refresh'' link next to it - but you can't set your own API key, and any scripts that use the old key will no longer work.<br />
<br />
Unlike the InfoCenter API from v2, the v3 API is HTTP-based - the API can send entire messages, not just single frames, and they will be cycled locally on the device. Additionally, messages sent through the API are visible from the InfoCenter Manager, and can be edited manually. The object that sends the HTTP request can be anywhere in-world. If you prefer the chat-based API, scroll to the bottom of the page.<br />
<br />
Invalid request types and internal errors will return <code>ERROR</code>. Although it is recommended to capture the request key and handle a response accordingly, it is not absolutely required. More information on LSL's <code>http_response</code> event is [http://wiki.secondlife.com/wiki/Http_response here.]<br />
<br />
===Setting a Message===<br />
You can set a message using the <code>set</code> request:<br />
<br />
llHTTPRequest("<nowiki>http://ntbigroup.com/gentek/infocenter/api.php?r=set&k=apikey</nowiki>",[HTTP_METHOD,"PUT"],"content");<br />
<br />
Replace ''apikey'' with the API key for the device or group you want to use, and replace ''content'' as described below. (This command will work for both devices and groups interchangeably.)<br />
<br />
This request can return the following in the <code>http_response</code> event:<br />
<br />
* <code>OK</code> - the message was sent to all devices succesfully<br />
* <code>GROUPFAIL</code> - the message was sent to some devices in the group, but some (not all) did not respond<br />
* <code>FAIL</code> - the message was not sent to any devices because none responded<br />
* <code>FORMAT-SEPARATOR</code> - your content string is not separated by <code>#$</code><br />
* <code>FORMAT-SLIDES</code> - your slide data and slide time lists are not the same length, or you sent more slides than the selected device/group can handle<br />
* <code>FORMAT-DATA</code> - one of your slide data strings is not the correct length<br />
* <code>FORMAT-TIME</code> - one of your slide times are not valid (<1 or >3600 seconds)<br />
** '''IMPORTANT:''' The API does not enforce the minimum slide times for high-capacity devices. If your slides are too fast, you may encounter problems.<br />
* <code>NOTFOUND</code> - the API key you used was not found<br />
<br />
====Content Format====<br />
The ''content'' for a set request must be of a very specific format. InfoCenter messages are composed like this:<br />
<br />
HELOWRLDWWWWWWWW|HOW R U?GGGGGGGG|GRAPHIC_Blank#$3|5|3<br />
<br />
There are two sections separated by <code>#$</code>. The first section is the slide data, the second section is the slide times. Slides are individually separated by <code>|</code> characters. They must be padded to fit on the display they are set on. Each slide time is in whole seconds (integers, not floats). Each slide data is composed like so:<br />
<br />
HOW R U?GGGGGGGG<br />
<br />
This is a single slide for a 8-character display. It is made up of the text and color strings concatenated together, each of which must be padded to <code>columns * rows</code> characters. So this could be an 8 x 1 display, or perhaps a 4 x 2 display.<br />
<br />
All InfoCenter devices support the same colors, each with a single-digit color code - '''R'''ed, '''O'''range, '''A'''mber, '''Y'''ellow, '''G'''reen, '''B'''lue, '''P'''urple, and '''W'''hite. Any characters used for color other than these will be interpreted as white. So, if you wanted to make a rainbow-colored line, you could do this:<br />
<br />
^^^^^^^^ROAYGBPW<br />
<br />
Remember that these strings are concatenated separately, not line-by-line. So, for an 8 x 3 display, it would look like this:<br />
<br />
^^^^^^^^^^^^^^^^^^^^^^^^ROAYGBPWROAYGBPWROAYGBPW<br />
<br />
====Alignment & Padding====<br />
For multiple-line displays, pad out each line individually, as the text will hard wrap. For example, on an 8 x 3 display:<br />
<br />
LEFT ALIGNED TEXT WWWWWWWWWWWWWWWWWWWWWWWW<br />
<br />
I AM CENTERED TEXT RRRRRRRRRRRRRRRRRRRRRRRR<br />
<br />
RIGHT ALIGNED TEXTAAAAAAAAAAAAAAAAAAAAAAAA<br />
<br />
Below is an LSL function for aligning each line:<br />
<br />
string align(string in, string dir, integer length, string pad)<br />
{<br />
if (pad == "") pad = " ";<br />
if (llToUpper(dir) == "L")<br />
{<br />
while (llStringLength(in) < length)<br />
{<br />
in = in + pad;<br />
}<br />
}<br />
else if (llToUpper(dir) == "R")<br />
{<br />
while (llStringLength(in) < length)<br />
{<br />
in = pad + in;<br />
}<br />
}<br />
else // assume center<br />
{<br />
integer osc = 0; // we have to be a little smarter here<br />
while (llStringLength(in) < length)<br />
{<br />
if (osc) in = pad + in; // this will align left, then right,<br />
else in = in + pad; // then left, then right...<br />
osc = !osc; // ... effectively centering the text<br />
}<br />
}<br />
return llGetSubString(in, 0, length - 1); // cut off any excess if we added it on accident<br />
}<br />
<br />
This function allows you to align text left, right, or centered, to a specific length (in our case, <code>columns</code>), using an optional customizable padding string. You can use this padding string for colors.<br />
<br />
For example, here's how to get the same text as above using this function (remember, we are on an 8 x 3 display):<br />
<br />
<code>align("LEFT", "L", 8, "") + align("ALIGNED", "L", 8, "") + align("TEXT", "L", 8, "") + align("", "", 24, "W")</code> - we can leave the padding string empty and it will default to a space<br />
<br />
<code>align("I AM", "", 8, "") + align("CENTERED", "", 8, "") + align("TEXT", "", 8, "") + align("", "", 24, "R")</code> - we can leave the alignment string empty and it will default to centered<br />
<br />
<code>align("RIGHT", "R", 8, "") + align("ALIGNED", "R", 8, "") + align("TEXT", "R", 8, "") + align("", "", 24, "A")</code><br />
<br />
Note the trick to create the color strings - by leaving the input and alignment strings empty, the function will simply create a string duplicating the padding string until it reaches the length. In our case, we used it to fill the entire display (8 x 3) with a single color. You could also make each line a separate color, or create a rainbow effect, like so:<br />
<br />
<code>align("", "", 24, "^") + align("", "", 8, "R") + align("", "", 8, "G") + align("", "", 8, "B")</code> - would make a red, green, and blue line<br />
<br />
<code>align("", "", 24, "^") + align("", "", 24, "ROAYGBPW")</code> - would make rainbow stripes (note that using any length of padding is fine, because any excess will be cut off)<br />
<br />
Slides must be of the correct length for the device they are set on, or they will be rejected by the API. Remember, the formula is <code>columns * rows</code> for the text and color strings - so <code>columns * rows * 2</code> for both of them combined together.<br />
<br />
====Graphic Slides====<br />
You can set graphic slides by simply taking the name of the graphic you want and adding <code>GRAPHIC_</code> to the beginning - for example, <code>GRAPHIC_Lane Open Down</code> for the Matrix. (If the graphic isn't supported by the model you are working with, it will show up as Blank.) Because graphics aren't colorable, you don't need to worry about color strings for them.<br />
<br />
====Example====<br />
Once you have your desired slides and times, you can do something like this to "finalize" them into the required format:<br />
<br />
string makeContent(list slide_data, list slide_times)<br />
{<br />
return llDumpList2String(slide_data, "|") + "#$" + llDumpList2String(slide_times, "|");<br />
}<br />
<br />
Note that the slide_data and slide_times lists must be of equal length.<br />
<br />
So, using the above functions (which are omitted for brevity), here's how to make (and send) a 3-slide centered message - replace ''apikey'' first. The entire script is included, and is extremely basic, but demonstrates how to also capture the response:<br />
<br />
'''REMEMBER: The following example uses the 8x3 display from the InfoCenter Mobile. If you are going to use the API for any other size, you will need to modify the number of characters in each slide.'''<br />
<br />
key api_request;<br />
<br />
default<br />
{<br />
state_entry()<br />
{<br />
api_request = llHTTPRequest("http://ntbigroup.com/gentek/infocenter/api.php?r=set&k=apikey", [HTTP_METHOD, "PUT"],<br />
makeContent([<br />
align("I AM", "", 8, "") + align("CENTERED", "", 8, "") + align("TEXT", "", 8, "") + align("", "", 8 * 3, "W") ,<br />
align("I AM", "", 8, "") + align("CENTERED", "", 8, "") + align("RED TEXT", "", 8, "") + align("", "", 8 * 3, "R") ,<br />
align("LOOK AT", "", 8, "") + align("THESE", "", 8, "") + align("COLORS", "", 8, "") + align("", "", 8 * 3, "ROAYGBPW")<br />
], [3, 3, 5])<br />
);<br />
}<br />
http_response(key request_id, integer status, list metadata, string body)<br />
{<br />
if (request_id == api_request)<br />
{<br />
api_request = NULL_KEY;<br />
if (status == 200) llOwnerSay("Response: " + body);<br />
else llOwnerSay("Server error. (" + (string)status + ")");<br />
}<br />
}<br />
}<br />
<br />
===Setting a Device's Group===<br />
You can set a device's group using the <code>grp</code> request:<br />
<br />
llHTTPRequest("<nowiki>http://ntbigroup.com/gentek/infocenter/api.php?r=grp&k=apikey</nowiki>", [HTTP_METHOD, "PUT"], "New Group Name");<br />
<br />
Replace ''apikey'' with the API key for the device you want to modify, and replace ''New Group Name'' with the group name that you want to add it to. To remove from a group, leave blank or enter ''NULL''.<br />
<br />
This request can return the following in the <code>http_response</code> event:<br />
<br />
* <code>OKNew Group Name</code> - the group was set successfully (the new group name is appended to <code>OK</code> - for example, when removing from a group, this will be <code>OKNULL</code>)<br />
* <code>LENGTH</code> - your group name is too long (maximum 64 characters)<br />
* <code>MISMATCH</code> - the group you want to join already exists and is for a different model<br />
* <code>NOTFOUND</code> - the API key you used was not found<br />
<br />
Remember, groups are never technically erased, so if adding to a group that previously existed but is currently empty, the group will be "recreated" using the old API key. This makes it possible to add devices to an empty group while knowing its API key in advance. However, it is not possible to get the group's API key through the API itself.<br />
<br />
===Renaming a Device or Group===<br />
You can rename a device or a group using the <code>ren</code> request:<br />
<br />
llHTTPRequest("<nowiki>http://ntbigroup.com/gentek/infocenter/api.php?r=ren&k=apikey</nowiki>", [HTTP_METHOD, "PUT"], "New Name");<br />
<br />
Replace ''apikey'' with the API key for the device or group you want to rename, and replace ''New Name'' with the new name you want to use. (This command will work for both devices and groups interchangeably.)<br />
<br />
This request can return the following in the <code>http_response</code> event:<br />
<br />
* <code>OKNew Name</code> - the name was set successfully (the new name is appended to <code>OK</code>)<br />
* <code>LENGTH</code> - your name is too short or too long (1-64 characters required)<br />
* <code>DUPLICATE</code> - the name you want to use already exists, or the device/group is already set to that name<br />
* <code>NOTFOUND</code> - the API key you used was not found<br />
<br />
Note that it is possible to remove all devices from a group by renaming the group to ''NULL''. However, this will make it impossible to use the group's API key again until a device is added to it.<br />
<br />
===Querying Device/Group Information===<br />
You can request information about a device or a group using the <code>inf</code> request:<br />
<br />
llHTTPRequest("<nowiki>http://ntbigroup.com/gentek/infocenter/api.php?r=inf&k=apikey</nowiki>", [HTTP_METHOD, "PUT"], "");<br />
<br />
Replace ''apikey'' with the API key for the device or group you want to get information about. The content field is not used. (This command will work for both devices and groups interchangeably.)<br />
<br />
This request can return the following in the <code>http_response</code> event:<br />
<br />
* For devices, a <code>#$</code>-separated string with the following: OK, DEVICE, device name/ID, device owner's username, device group, device model, device columns, device rows, max supported slides, location, UUID<br />
** For example: <code>OK#$DEVICE#$Unnamed 1#$nelson.jenkins#$NULL#$InfoCenter Mobile#$8#$3#$42#$Prototype (142, 228, 43)#$9794a972-0131-3f33-7059-b04fc5ad92dd</code><br />
* For groups, a <code>#$</code>-separated string with the following: OK, GROUP, group name, group owner's username, device model, device columns, device rows, max supported slides, number of devices in group<br />
** For example: <code>OK#$GROUP#$Test Group#$nelson.jenkins#$InfoCenter Personal#$16#$1#$60#$2</code><br />
* <code>NOTFOUND</code> - the API key you used was not found<br />
<br />
Use [http://wiki.secondlife.com/wiki/LlParseStringKeepNulls llParseStringKeepNulls] to split the response up. Also, do not rely on the return data to contain the same number of values forever; more may be added.<br />
<br />
===Chat API===<br />
Starting in v3.1, all InfoCenter displays support a basic chat API to set the display only. If you are experimenting with the API, it is strongly recommended that you start with the web-based API to ensure your requests are properly formatted, then switch to the chat API.<br />
<br />
The chat API mode is different in the following ways:<br />
<br />
* The chat API '''does not validate any data you send'''. The input sent to the chat API is processed immediately without regard for formatting mistakes. This can cause some odd behavior.<br />
* The chat API can only accept 1024 characters per request, which can limit the data you can send per request. However, all InfoCenter displays can support at least one frame within 1024 characters.<br />
* The chat API can only set the text on the display (a "set" request). It cannot set the display's group, rename it, or query it for information.<br />
* Text sent to the display through the chat API will not update the saved text shown when accessing the display through the website editor.<br />
* The chat API cannot set a display by its API key. To set a single display, you must use the display's UUID and use llRegionSayTo.<br />
* The chat API can only set a single display at once using llRegionSayTo. It cannot send a message to an entire group. While you can set multiple displays through llWhisper, llSay, llShout, and llRegionSay, you cannot do so if you have different sizes of displays in range, as that will cause issues.<br />
* The chat API will only work in the same region for displays owned by the same owner.<br />
* The chat API is somewhat faster than the web API and can handle setting multiple devices at once or in sequence very quickly. Each display can also queue up to 64 requests and will process them in order.<br />
<br />
The format for the chat API is the same as the web API's "set" request. However, the request is sent over channel -495310229, like so:<br />
<br />
default<br />
{<br />
state_entry()<br />
{<br />
llRegionSayTo("displayuuid", -495310229,<br />
makeContent([<br />
align("I AM", "", 8, "") + align("CENTERED", "", 8, "") + align("TEXT", "", 8, "") + align("", "", 8 * 3, "W") ,<br />
align("I AM", "", 8, "") + align("CENTERED", "", 8, "") + align("RED TEXT", "", 8, "") + align("", "", 8 * 3, "R") ,<br />
align("LOOK AT", "", 8, "") + align("THESE", "", 8, "") + align("COLORS", "", 8, "") + align("", "", 8 * 3, "ROAYGBPW")<br />
], [3, 3, 5])<br />
);<br />
}<br />
}<br />
<br />
{{Gentek}}</div>NelsonJenkinshttps://wiki.ntbigroup.com/index.php?title=InfoCenter_v3_Legacy_API&diff=2913InfoCenter v3 Legacy API2020-03-14T20:30:51Z<p>NelsonJenkins: </p>
<hr />
<div>The '''InfoCenter''' is a series of electronic text display signs (Personal, Notice, Highway, Matrix, and Mobile) sold by [[Gentek]]. This page covers the legacy API for the InfoCenter Series v3 and above. For the JSON API, which is highly recommended, [[InfoCenter|see here]].<br />
<br />
==API Documentation==<br />
If you aren't planning on using the API as a scripter, you don't need to read this part - everything below this line is about the API. If you are, you'll be surprised how much you can do through the API.<br />
<br />
The InfoCenter API allows you to control any sign from anywhere in-world or from any web server. You can set messages, change groups, rename things, and query for information. All you need is the API key for the display or group you want to control - you can even use API keys for displays you do not own.<br />
<br />
That said, '''keep your API keys private'''! If anyone else gets a copy of your API key, they can control your device without you knowing. (Of course, you can give API keys out to trusted people if you want them to control your devices.) If this happens, you can reset your API key by clicking the ''Refresh'' link next to it - but note that you can't set your own API key, and any scripts that use the old key will no longer work.<br />
<br />
Unlike the InfoCenter API from v2, the v3 API is HTTP-based, and the "server" can be deleted or do other things - the API can send entire messages, not just single frames, and they will be cycled locally on the device. Additionally, messages sent through the API are visible from the InfoCenter Manager, and can be edited manually. As stated above, the API object can be anywhere in-world, and no longer has to be in the same region - scripters with knowledge of PHP or other web server languages can also use the API by adapting the commands shown here (this will not be documented, so it's a DIY job). If you prefer a chat-based API, scroll to the bottom of the page.<br />
<br />
All commands return some form of usable repsonse. Invalid request types and internal errors will return <code>ERROR</code>. Although it is recommended to capture the request key and handle a response accordingly, it is not absolutely required. More information on LSL's <code>http_response</code> event is [http://wiki.secondlife.com/wiki/Http_response here.]<br />
<br />
===Setting a Message===<br />
You can set a message using the <code>set</code> request:<br />
<br />
llHTTPRequest("<nowiki>http://ntbigroup.com/gentek/infocenter/api.php?r=set&k=apikey</nowiki>",[HTTP_METHOD,"PUT"],"content");<br />
<br />
Replace ''apikey'' with the API key for the device or group you want to use, and replace ''content'' as described below. (This command will work for both devices and groups interchangeably.)<br />
<br />
This request can return the following in the <code>http_response</code> event:<br />
<br />
* <code>OK</code> - the message was sent to all devices succesfully<br />
* <code>GROUPFAIL</code> - the message was sent to some devices in the group, but some (not all) did not respond<br />
* <code>FAIL</code> - the message was not sent to any devices because none responded<br />
* <code>FORMAT-SEPARATOR</code> - your content string is not separated by <code>#$</code><br />
* <code>FORMAT-SLIDES</code> - your slide data and slide time lists are not the same length, or you sent more slides than the selected device/group can handle<br />
* <code>FORMAT-DATA</code> - one of your slide data strings is not the correct length<br />
* <code>FORMAT-TIME</code> - one of your slide times are not valid (<1 or >3600 seconds)<br />
** '''IMPORTANT:''' The API does not enforce the minimum slide times for high-capacity devices. If your slides are too fast, you may encounter problems.<br />
* <code>NOTFOUND</code> - the API key you used was not found<br />
<br />
====Content Format====<br />
The ''content'' for a set request must be of a very specific format. InfoCenter messages are composed like this:<br />
<br />
HELOWRLDWWWWWWWW|HOW R U?GGGGGGGG|GRAPHIC_Blank#$3|5|3<br />
<br />
This looks confusing, so let's take it step by step.<br />
<br />
First, there are two sections separated by <code>#$</code>. The first section is the slide data, the second section is the slide times. Slides are individually separated by <code>|</code> characters. They must be padded to fit on the display they are set on. Each slide time is in whole seconds (integers, not floats), but slide data is more confusing:<br />
<br />
HOW R U?GGGGGGGG<br />
<br />
This is a single slide for a 8-character display. It is made up of the text and color strings concatenated together, each of which must be padded to <code>columns * rows</code> characters. So this could be an 8 x 1 display, or perhaps a 4 x 2 display. Think of these two strings as different "layers" of the slide - the color "layer" moves over to cover up the text "layer", coloring those characters individually.<br />
<br />
All InfoCenter devices support the same colors, each with a single-digit color code - '''R'''ed, '''O'''range, '''A'''mber, '''Y'''ellow, '''G'''reen, '''B'''lue, '''P'''urple, and '''W'''hite. Any characters used for color other than these will be interpreted as white. So, if you wanted to make a rainbow-colored line, you could do this:<br />
<br />
^^^^^^^^ROAYGBPW<br />
<br />
Remember that these strings are concatenated separately, not line-by-line. So, for an 8 x 3 display, it would look like this:<br />
<br />
^^^^^^^^^^^^^^^^^^^^^^^^ROAYGBPWROAYGBPWROAYGBPW<br />
<br />
====Alignment & Padding====<br />
For multiple-line displays, you'll want to pad out each line individually, as the text will hard wrap. For example, on an 8 x 3 display (note that this uses <code>_</code> characters for spacing - because of wiki formatting, it's impossible to display multiple space characters, so just pretend):<br />
<br />
LEFT____ALIGNED_TEXT____WWWWWWWWWWWWWWWWWWWWWWWW<br />
<br />
__I AM__CENTERED__TEXT__RRRRRRRRRRRRRRRRRRRRRRRR<br />
<br />
___RIGHT_ALIGNED____TEXTAAAAAAAAAAAAAAAAAAAAAAAA<br />
<br />
Below is an LSL function for aligning each line:<br />
<br />
string align(string in, string dir, integer length, string pad)<br />
{<br />
if (pad=="") pad=" ";<br />
if (llToUpper(dir)=="L")<br />
{<br />
while (llStringLength(in) < length)<br />
{<br />
in=in+pad;<br />
}<br />
}<br />
else if (llToUpper(dir)=="R")<br />
{<br />
while (llStringLength(in) < length)<br />
{<br />
in=pad+in;<br />
}<br />
}<br />
else // assume center<br />
{<br />
integer osc=0; // we have to be a little smarter here<br />
while (llStringLength(in) < length)<br />
{<br />
if (osc) in=pad+in; // this will align left, then right,<br />
else in=in+pad; // then left, then right...<br />
osc=!osc; // ... effectively centering the text<br />
}<br />
}<br />
return llGetSubString(in,0,length-1); // cut off any excess if we added it on accident<br />
}<br />
<br />
This function allows you to align text left, right, or centered, to a specific length (in our case, <code>columns</code>), using an optional customizable padding string. You can use this padding string for colors.<br />
<br />
For example, here's how to get the same text as above using this function (remember, we are on an 8 x 3 display):<br />
<br />
<code>align("LEFT","L",8,"") + align("ALIGNED","L",8,"") + align("TEXT","L",8,"") + align("","",24,"W")</code> - we can leave the padding string empty and it will default to a space<br />
<br />
<code>align("I AM","",8,"") + align("CENTERED","",8,"") + align("TEXT","",8,"") + align("","",24,"R")</code> - we can leave the alignment string empty and it will default to centered<br />
<br />
<code>align("RIGHT","R",8,"") + align("ALIGNED","R",8,"") + align("TEXT","R",8,"") + align("","",24,"A")</code><br />
<br />
Note that we used a trick to create the color strings - by leaving the input and alignment strings empty, the function will simply create a string duplicating the padding string until it reaches the length. In our case, we used it to fill the entire display (8 x 3) with a single color. You could also make each line a separate color, or create a rainbow effect, like so:<br />
<br />
<code>align("","",24,"^") + align("","",8,"R") + align("","",8,"G") + align("","",8,"B")</code> - would make a red, green, and blue line<br />
<br />
<code>align("","",24,"^") + align("","",24,"ROAYGBPW")</code> - would make rainbow stripes (note that using any length of padding is fine, because any excess will be cut off)<br />
<br />
Slides must be of the correct length for the device they are set on, or they will be rejected by the API. Remember, the formula is <code>columns * rows</code> for the text and color strings - so <code>columns * rows * 2</code> for both of them combined together.<br />
<br />
====Example====<br />
Okay, let's start backing up. Recall that all slides are separated by the <code>|</code> character, but there was one slide - GRAPHIC_Blank - which looks odd. That's because you can set graphic slides by simply taking the name of the graphic you want and adding <code>GRAPHIC_</code> to the beginning - for example, <code>GRAPHIC_Lane Open Down</code> for the Matrix. (If the graphic isn't supported by the model you are working with, it will show up as Blank.) Because graphics aren't colorable, you don't need to worry about color strings for them.<br />
<br />
Once you have your desired slides and times, you can do something like this to "finalize" them into the required format:<br />
<br />
string makeContent(list slide_data, list slide_times)<br />
{<br />
return llDumpList2String(slide_data,"|") + "#$" + llDumpList2String(slide_times,"|");<br />
}<br />
<br />
Note that the slide_data and slide_times lists must be of equal length.<br />
<br />
So, using the above functions (which are omitted for brevity), here's how to make (and send) a 3-slide centered message - obviously you'll have to replace ''apikey'' first. The entire script is included, and is extremely basic, but demonstrates how to also capture the response:<br />
<br />
'''REMEMBER: The following example uses the 8x3 display from the InfoCenter Mobile. If you are going to use the API for any other size, you will need to modify the number of characters in each slide.'''<br />
<br />
key api_request;<br />
<br />
default<br />
{<br />
state_entry()<br />
{<br />
api_request=llHTTPRequest("http://ntbigroup.com/gentek/infocenter/api.php?r=set&k=apikey",[HTTP_METHOD,"PUT"],<br />
makeContent([<br />
align("I AM","",8,"") + align("CENTERED","",8,"") + align("TEXT","",8,"") + align("","",24,"W") ,<br />
align("I AM","",8,"") + align("CENTERED","",8,"") + align("RED TEXT","",8,"") + align("","",24,"R") ,<br />
align("LOOK AT","",8,"") + align("THESE","",8,"") + align("COLORS","",8,"") + align("","",24,"ROAYGBPW")<br />
],[3,3,5])<br />
);<br />
}<br />
http_response(key request_id, integer status, list metadata, string body)<br />
{<br />
if (request_id==api_request)<br />
{<br />
api_request=NULL_KEY;<br />
if (status==200) llOwnerSay("Response: "+body);<br />
else llOwnerSay("Server error. ("+(string)status+")");<br />
}<br />
}<br />
}<br />
<br />
===Setting a Device's Group===<br />
You can set a device's group using the <code>grp</code> request:<br />
<br />
llHTTPRequest("<nowiki>http://ntbigroup.com/gentek/infocenter/api.php?r=grp&k=apikey</nowiki>",[HTTP_METHOD,"PUT"],"New Group Name");<br />
<br />
Replace ''apikey'' with the API key for the device you want to modify, and replace ''New Group Name'' with the group name that you want to add it to. To remove from a group, leave blank or enter ''NULL''.<br />
<br />
This request can return the following in the <code>http_response</code> event:<br />
<br />
* <code>OKNew Group Name</code> - the group was set successfully (the new group name is appended to <code>OK</code> - for example, when removing from a group, this will be <code>OKNULL</code>)<br />
* <code>LENGTH</code> - your group name is too long (maximum 64 characters)<br />
* <code>MISMATCH</code> - the group you want to join already exists and is for a different model<br />
* <code>NOTFOUND</code> - the API key you used was not found<br />
<br />
Remember, groups are never technically erased, so if adding to a group that previously existed but is currently empty, the group will be "recreated" using the old API key. This makes it possible to add devices to an empty group while knowing its API key in advance. However, it is not possible to get the group's API key through the API itself.<br />
<br />
===Renaming a Device or Group===<br />
You can rename a device or a group using the <code>ren</code> request:<br />
<br />
llHTTPRequest("<nowiki>http://ntbigroup.com/gentek/infocenter/api.php?r=ren&k=apikey</nowiki>",[HTTP_METHOD,"PUT"],"New Name");<br />
<br />
Replace ''apikey'' with the API key for the device or group you want to rename, and replace ''New Name'' with the new name you want to use. (This command will work for both devices and groups interchangeably.)<br />
<br />
This request can return the following in the <code>http_response</code> event:<br />
<br />
* <code>OKNew Name</code> - the name was set successfully (the new name is appended to <code>OK</code>)<br />
* <code>LENGTH</code> - your name is too short or too long (1-64 characters required)<br />
* <code>DUPLICATE</code> - the name you want to use already exists, or the device/group is already set to that name<br />
* <code>NOTFOUND</code> - the API key you used was not found<br />
<br />
Note that it is possible to remove all devices from a group by renaming the group to ''NULL''. However, this will make it impossible to use the group's API key again until a device is added to it.<br />
<br />
===Querying Device/Group Information===<br />
You can request information about a device or a group using the <code>inf</code> request:<br />
<br />
llHTTPRequest("<nowiki>http://ntbigroup.com/gentek/infocenter/api.php?r=inf&k=apikey</nowiki>",[HTTP_METHOD,"PUT"],"");<br />
<br />
Replace ''apikey'' with the API key for the device or group you want to get information about. The content field is not used. (This command will work for both devices and groups interchangeably.)<br />
<br />
Running this command on its own without capturing the response is worthless, so you'll want to do that.<br />
<br />
This request can return the following in the <code>http_response</code> event:<br />
<br />
* For devices, a <code>#$</code>-separated string with the following: OK, DEVICE, device name/ID, device owner's username, device group, device model, device columns, device rows, max supported slides, location, UUID<br />
** For example: <code>OK#$DEVICE#$Unnamed 1#$nelson.jenkins#$NULL#$InfoCenter Mobile#$8#$3#$42#$Prototype (142, 228, 43)#$9794a972-0131-3f33-7059-b04fc5ad92dd</code><br />
* For groups, a <code>#$</code>-separated string with the following: OK, GROUP, group name, group owner's username, device model, device columns, device rows, max supported slides, number of devices in group<br />
** For example: <code>OK#$GROUP#$Test Group#$nelson.jenkins#$InfoCenter Personal#$16#$1#$60#$2</code><br />
* <code>NOTFOUND</code> - the API key you used was not found<br />
<br />
You'll probably want to make use of [http://wiki.secondlife.com/wiki/LlParseStringKeepNulls llParseStringKeepNulls] for this - although it is not technically possible for null entries to appear, don't rule out the possibility. Also, do not expect this command to return data at this length forever - we may add additional fields (however unlikely) in the future, so don't check the response list length.<br />
<br />
===Chat API===<br />
Starting in v3.1, all InfoCenter displays support a basic chat API to set the display only. If you are experimenting with the API, it is strongly recommended that you start with the web-based API to ensure your requests are properly formatted, then switch to the chat API.<br />
<br />
The chat API mode is different in the following ways:<br />
<br />
* The chat API '''does not validate any data you send'''. The input sent to the chat API is processed immediately without regard for formatting mistakes. This can cause some odd behavior.<br />
* The chat API can only accept 1024 characters per request, which can limit the data you can send per request. However, all InfoCenter displays can support at least one frame within 1024 characters.<br />
* The chat API can only set the text on the display (a "set" request). It cannot set the display's group, rename it, or query it for information.<br />
* Text sent to the display through the chat API will not update the saved text shown when accessing the display through the website editor.<br />
* The chat API cannot set a display by its API key. To set a single display, you must use the display's UUID and use llRegionSayTo.<br />
* The chat API can only set a single display at once using llRegionSayTo. It cannot send a message to an entire group. While you can set multiple displays through llWhisper, llSay, llShout, and llRegionSay, you cannot do so if you have different sizes of displays in range, as that will cause issues.<br />
* The chat API will only work in the same region for displays owned by the same owner.<br />
* The chat API is somewhat faster than the web API and can handle setting multiple devices at once or in sequence very quickly. Each display can also queue up to 64 requests and will process them in order.<br />
<br />
The format for the chat API is the same as the web API's "set" request. However, the request is sent over channel -495310229, like so:<br />
<br />
default<br />
{<br />
state_entry()<br />
{<br />
llRegionSayTo("displayuuid", -495310229,<br />
makeContent([<br />
align("I AM", "", 8, "") + align("CENTERED", "", 8, "") + align("TEXT", "", 8, "") + align("", "", 24, "W") ,<br />
align("I AM", "", 8, "") + align("CENTERED", "", 8, "") + align("RED TEXT", "", 8, "") + align("", "", 24, "R") ,<br />
align("LOOK AT", "", 8, "") + align("THESE", "", 8, "") + align("COLORS", "", 8, "") + align("", "", 24, "ROAYGBPW")<br />
], [3,3,5])<br />
);<br />
}<br />
}<br />
<br />
{{Gentek}}</div>NelsonJenkins